Как закрыть окно 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() 
  • Python / Tkinter: Включить / выключить обновления экрана, такие как wxPython Freeze / Thaw?
  • Перетаскивание виджеты tkinter
  • Почему Python не ждет завершения моей функции?
  • Получение каждого дочернего виджета окна Tkinter
  • Как остановить выполнение программы Python в IDLE
  • Как скрыть консоль Windows с помощью python Tkinter?
  • Как получить информацию о сетке от нажатой кнопки в tkinter?
  • Получить входные данные из флажка в python tkinter?
  • Как создать столбцы равной ширины в Python 2.7 с помощью Tkinter
  • Переопределение кнопки кнопки Tkinter «X» (кнопка, закрывающая окно)
  • Окна TKinter не отображаются при использовании многопроцессорности в Linux
  •  
    Interesting Posts for Van-Lav

    Ошибка opencv python: утверждение не выполнено (size.width> 0 && size.height> 0)

    В Tkinter есть ли способ сделать виджет невидимым?

    Определение версии версии Flask

    Почему в примере кода есть пробел в python threading

    Python Shapely пересечение: параллельные плоскости

    Когда следует использовать uuid.uuid1 () vs. uuid.uuid4 () в python?

    Ошибка в программе переименования Python … Нет такого файла или каталога (Fnmatch)

    Python – возобновить веб-сеанс от urllib2 после входа в браузер

    Django – Как использовать асинхронную очередь задач с сельдереем и redis

    Получение более полезного вывода ошибок модуля «logging» в python

    OpenCV / Array должен быть CvMat или IplImage / Освобождение объекта захвата

    Существует ли поддержка IN-оператора на языке SQL Expression, используемом в SQLAlchemy?

    метод итерации по определенным столбцам модели sqlalchemy?

    Pygame: разрешить кликам пройти через окно

    Flask OperationalError: невозможно открыть файл базы данных с помощью sqlite3

    Python - лучший язык программирования в мире.