2008-09-21 5 views
45

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

from Tkinter import * 

def quit(): 
    # code to exit 

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

Как следует определить функцию quit, чтобы выйти из моего приложения?

ответ

48

Вы должны использовать 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 
+2

Если Используется root.quit(), как можно снова найти окно позже в другом скрипте, который будет уничтожен (чтобы не продолжать использовать системные ресурсы)? – Raj 2016-06-29 00:14:07

34
def quit() 
    global root 
    root.quit() 

или

def quit() 
    global root 
    root.destroy() 
+27

Декларация 'global' не требуется. Вам нужно только «глобальное», если вы хотите назначить глобальное имя из функции. 'root.quit()' просто ищет корень, он не присваивает root. – 2008-09-21 14:05:51

+0

Кто-нибудь знает, какой метод более «правильный», или это один из примеров, более читабельен, чем другой – Lee 2011-05-07 03:09:50

+8

извините, я нашел ответ и просто подумал, что я поделюсь им. Лучше использовать `root.destroy()`, поскольку он завершает основной цикл программы. См .: http://www.daniweb.com/software-development/python/threads/66698](http://www.daniweb.com/software-development/python/threads/66698/299275#post299275) – Lee 2011-05-07 03:13:04

4

Обычный метод для выхода из программы Python:

sys.exit() 

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

raise SystemExit 

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

13
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

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

Во-первых, вы должны изменить вашу функцию следующим образом:

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

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

-3

попробуйте это.

self.parent.destroy() 
    self.parent.quit() 

Возможно, вы отправите параметр корневого типа в кадр, который вы сделали.поэтому, если вы хотите закончить его, вы должны позвонить своему отцу, чтобы он мог закрыть все, вместо того, чтобы закрыть каждого из своих детей.

-1

Используйте root.destroy()! Работает для меня просто отлично.

3

освещение в случае замешательства ...

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

A) уничтожить() останавливает MainLoop и убивает окно, но оставляет питона работает

В) выход() останавливает весь процесс

Просто поясните, если кто-то пропустил то, что делал destroy(), и OP также спросил, как «закончить» программу tkinter.

-2

Попробуйте это:

from Tkinter import * 
import sys 
def exitApp(): 
    sys.exit() 
root = Tk() 
Button(root, text="Quit", command=exitApp).pack() 
root.mainloop() 
1

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

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

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

1

Вы можете использовать:

root.destroy() 

Или

root.quit() 

Если это не работает, изменение корня к тому, что когда-либо переменная была в начале вашей программы

import tkinter 

main = Tk() 

main.destroy() 

main.mainloop 
0
def quit1(): 
    root.destroy() 

Button(root, text="Quit", command=quit1).pack() 
root.mainloop() 
Смежные вопросы