Как закрыть окно tkinter? - PullRequest
       158

Как закрыть окно tkinter?

65 голосов
/ 21 сентября 2008

Как мне завершить программу Tkinter? Допустим, у меня есть этот код:

from Tkinter import *

def quit():
    # code to exit

root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

Как определить функцию quit для выхода из приложения?

Ответы [ 17 ]

76 голосов
/ 22 марта 2013

Вы должны использовать destroy(), чтобы закрыть окно tkinter.

from Tkinter import *

root = Tk()
Button(root, text="Quit", command=root.destroy).pack()
root.mainloop()

Пояснение:

root.quit()

В приведенной выше строке просто Обходит root.mainloop() т.е. root.mainloop() все равно будет работать в фоновом режиме, если будет выполнена команда quit().

root.destroy()

Пока destroy() команда исчезает root.mainloop() т.е. root.mainloop() останавливается.

Так как вы просто хотите выйти из программы, вы должны использовать root.destroy(), так как это остановит mainloop().

Но если вы хотите запустить какой-то бесконечный цикл и не хотите разрушать свое окно Tk и хотите выполнить некоторый код после строки root.mainloop(), тогда вам следует использовать root.quit(). Пример:

from Tkinter import *
def quit():
    global root
    root.quit()

root = Tk()
while True:
    Button(root, text="Quit", command=quit).pack()
    root.mainloop()
    #do something
36 голосов
/ 21 сентября 2008
def quit()
    global root
    root.quit()

или

def quit()
    global root
    root.destroy()
15 голосов
/ 16 ноября 2008
import Tkinter as tk

def quit(root):
    root.destroy()

root = tk.Tk()
tk.Button(root, text="Quit", command=lambda root=root:quit(root)).pack()
root.mainloop()
6 голосов
/ 17 сентября 2013

Я думаю, вы неправильно поняли функцию выхода из Tkinter. Эта функция не требует от вас определения.

Сначала вы должны изменить свою функцию следующим образом:

from Tkinter import *
root = Tk()
Button(root, text="Quit", command=root.quit).pack()
root.mainloop()

Затем вы должны использовать суффикс «.pyw», чтобы сохранить эти файлы, и дважды щелкнуть файл «.pyw», чтобы запустить графический интерфейс. На этот раз вы можете завершить работу с графическим интерфейсом одним нажатием кнопки, и вы можете также найдите, что не будет неприятного окна DOS. (Если вы запустите файл '.py', функция выхода завершится ошибкой.)

4 голосов
/ 21 сентября 2008

Обычный способ выхода из программы на Python:

sys.exit()

(к которому вы также можете передать статус выхода) или

raise SystemExit

будет отлично работать в программе Tkinter.

3 голосов
/ 27 августа 2016

Подсветка в случае путаницы ...

def quit(self):
    self.destroy()
    exit()

A) destroy () останавливает основной цикл и убивает окно, но оставляет работающий питон

B) exit () останавливает весь процесс

Просто чтобы уточнить, если кто-то пропустил, что делает destroy (), и ОП также спросил, как "завершить" программу tkinter.

1 голос
/ 23 мая 2017

В idlelib.PyShell модуле, root переменная типа Tk определена как глобальная

В конце функции PyShell.main() она вызывает функцию root.mainloop(), которая представляет собой бесконечный цикл, и работает до тех пор, пока цикл не прервется функцией root.quit(). Следовательно, root.quit() только прервет выполнение mainloop

Чтобы уничтожить все виджеты, относящиеся к этому окну idlelib, необходимо вызвать root.destroy(), что является последней строкой функции idlelib.PyShell.main().

1 голос
/ 24 июля 2018

Самый простой способ - нажать красную кнопку (крайняя слева в macOS и крайняя справа в Windows). Если вы хотите привязать определенную функцию к виджету кнопки, вы можете сделать это:

class App:
    def __init__(self, master)
        frame = Tkinter.Frame(master)
        frame.pack()
        self.quit_button = Tkinter.Button(frame, text = 'Quit', command = frame.quit)
        self.quit_button.pack()

Или, чтобы сделать вещи немного сложнее, используйте обработчики протокола и метод destroy().

import tkMessageBox

def confirmExit():
    if tkMessageBox.askokcancel('Quit', 'Are you sure you want to exit?'):
        root.destroy()
root = Tk()
root.protocol('WM_DELETE_WINDOW', confirmExit)
root.mainloop()
1 голос
/ 05 апреля 2019

вам нужно всего лишь набрать это:

root.destroy()

и вам даже не нужна причина функции quit (), если вы установите ее в качестве команды, она выйдет из всей программы.

1 голос
/ 29 октября 2018

В случае, если кто-то хочет привязать свою кнопку Escape к закрытию всего GUI:

master = Tk()
master.title("Python")

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...