Как закрыть окно Tkinter нажатием кнопки?

Напишите графическое приложение с кнопкой "Good-bye" . Когда Button нажата, окно закрывается.

Это мой код до сих пор, но он не работает. Может ли кто-нибудь помочь мне с моим кодом?

 from Tkinter import * window = Tk() def close_window (root): root.destroy() frame = Frame(window) frame.pack() button = Button (frame, text = "Good-bye.", command = close_window) button.pack() window.mainloop() 

5 Solutions collect form web for “Как закрыть окно Tkinter нажатием кнопки?”

С минимальным редактированием вашего кода (не уверен, что они преподавали классы или нет в вашем курсе), измените:

 def close_window(root): root.destroy() 

в

 def close_window(): window.destroy() 

и он должен работать.


Объяснение:

Ваша версия close_window определяется как close_window один аргумент, а именно root . Впоследствии, любые вызовы вашей версии close_window должны иметь этот аргумент, или Python даст вам ошибку во время выполнения .

Когда вы создали Button , вы сказали кнопке запустить close_window когда она нажата. Однако исходный код для виджета Button выглядит примерно так:

 # 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. #... 

Как мой код говорит, класс Button вызовет вашу функцию без аргументов. Однако ваша функция ожидает аргумента. Таким образом, у вас была ошибка. Итак, если мы выберем этот аргумент, чтобы вызов функции выполнялся внутри класса Button, у нас осталось:

 def close_window(): root.destroy() 

Однако это не так, потому что root никогда не назначается значение. Это было бы похоже на print(x) если вы еще не определили x .

Глядя на ваш код, я решил, что вы хотите вызвать destroy на window , поэтому я изменил его на window .

Вы можете напрямую связать объект объекта window.destroy с атрибутом команды вашей button :

 button = Button (frame, text="Good-bye.", command=window.destroy) 

Таким образом вам не понадобится функция close_window чтобы закрыть окно для вас.

Вы можете создать класс, который расширяет класс Button Tkinter, который будет специализирован для закрытия вашего окна, связав метод destroy с его атрибутом command :

 from tkinter import * class quitButton(Button): def __init__(self, parent): Button.__init__(self, parent) self['text'] = 'Good Bye' # Command to close the window (the destory method) self['command'] = parent.destroy self.pack(side=BOTTOM) root = Tk() quitButton(root) mainloop() 

Это результат:

введите описание изображения здесь


И причина, по которой ваш код не работал раньше:

 def close_window (): # root.destroy() window.destroy() 

У меня есть небольшое ощущение, что вы можете получить корень из другого места, так как вы сделали window = tk() .

Когда вы вызываете уничтожение в window в Tkinter, это означает уничтожение всего приложения, поскольку ваше window (корневое окно) является основным окном для приложения. ИМХО, я думаю, вы должны изменить свое window на root .

 from tkinter import * def close_window(): root.destroy() # destroying the main window root = Tk() frame = Frame(root) frame.pack() button = Button(frame) button['text'] ="Good-bye." button['command'] = close_window button.pack() mainloop() 

Вы можете использовать lambda для передачи ссылки на объект window качестве аргумента функции close_window :

 button = Button (frame, text="Good-bye.", command = lambda: close_window(window)) 

Это работает, потому что атрибут command ожидает вызываемого или вызываемого объекта. lambda является вызываемой, но в этом случае она по существу является результатом вызова данной функции с заданными параметрами.

По сути, вы вызываете лямбда-оболочку функции, у которой нет аргументов, а не самой функции.

 from tkinter import * def close_window(): import sys sys.exit() root = Tk() frame = Frame (root) frame.pack() button = Button (frame, text="Good-bye", command=close_window) button.pack() mainloop() 
  • Контрольный шрифт в tkMessageBox
  • Функции Matplotlib в tkinter
  • Anaconda python, PIL и imagingtk
  • Python tkinter отключает кнопку, пока все поля не будут заполнены
  • Задержка времени Tkinter
  • Изображение не отображается на Tkinter
  • Изменение размера изображения под PhotoImage
  • Цифровой дисплей часов - требуется многопоточность?
  • Python - лучший язык программирования в мире.