Con la edición mínima de su código (no estoy seguro si han impartido clases o no en su curso), cambie:
def close_window(root):
root.destroy()
a
def close_window():
window.destroy()
y debería funcionar .
Explicación:
Su versión de close_window
se define esperar que un solo argumento, a saber root
. Posteriormente, cualquier llamada a su versión de close_window
necesita tener ese argumento, o Python le dará un error en tiempo de ejecución.
Cuando creó un Button
, le indicó al botón que se ejecute close_window
cuando se hace clic en él. Sin embargo, el código fuente de control Botón es algo así como:
# class constructor
def __init__(self, some_args, command, more_args):
#...
self.command = command
#...
# this method is called when the user clicks the button
def clicked(self):
#...
self.command() # Button calls your function with no arguments.
#...
Como mis estados de código, la clase Button
llamará a su función sin argumentos. Sin embargo, su función está esperando un argumento. Por lo tanto, tuviste un error. Por lo tanto, si tomamos que el argumento, por lo que la llamada a la función se ejecutará dentro de la clase Button, que nos queda:
def close_window():
root.destroy()
eso no es correcto, sin embargo, tampoco, porque root
Nunca se le asigna un valor.Sería como escribir en print(x)
cuando aún no ha definido x
.
En cuanto a su código, pensé que quería llamar destroy
en window
, por lo que cambió a root
window
.
Hey Matt. Gracias por tener una pregunta clara y un ejemplo de código limpio y simple para acompañar. ¿Podría también asegurarse de incluir el rastreo (bloqueo) en el futuro cuando su código "no funciona"? Eso también ayudará a las personas a descubrir casi instantáneamente qué parte de su código se ha roto. Obviamente, en este caso, la muestra del código es tan pequeña que es fácil de identificar, pero podría ayudarlo a obtener respuestas en el futuro en situaciones más difíciles. – jdi
Para cualquiera que no vea el problema de inmediato, el error es 'TypeError: close_window() falta 1 argumento de posición requerido: 'root''. Esto significa que no se ha pasado ningún argumento a la devolución de llamada 'close_window', ya que nunca existe para las funciones' command = '. Las devoluciones de llamada de eventos enlazados reciben un argumento: el objeto de evento. –