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

87

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

from Tkinter import *

def quit():
    # code to exit

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

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

Мэтт Грегори
источник

Ответы:

120

Вы должны использовать, 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
аки92
источник
2
Если используется root.quit (), как можно позже снова найти окно в другом сценарии, который будет уничтожен (чтобы не продолжать использовать системные ресурсы)?
Raj
3
Ваше первое утверждение неверно. вызов quitуничтожит все виджеты; если виджеты уничтожены, mainloopвыйдет.
Bryan Oakley
1
После некоторых исследований я считаю, что это также относится ко ВСЕМ выполняемому коду. Поэтому, если у вас есть mainloop () TKinter в сценарии командной строки, используйте root.quit (), а не root.destroy (), иначе ваш сценарий командной строки не будет продолжать выполнение кода после mainloop (). Я протестировал это, и он у меня работает (я знаю, что TKinter не предназначен для использования в таком дизайне, тем не менее, он работает)
Alex
это хорошее решение - уничтожить окно Tkinter много раз и запускать много раз
Нитеш Вагмаре
40
def quit()
    root.quit()

или же

def quit()
    root.destroy()
Мэтт Грегори
источник
знает ли кто-нибудь, какой метод более «правильный», или один из них более читабелен, чем другой
Опал
8
извините, я нашел ответ и просто подумал, что поделюсь им. Лучше использовать, так root.destroy()как он завершает основной цикл программы. См .: http://www.daniweb.com/software-development/python/threads/66698
Opal,
17
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()
ThiefMaster
источник
7

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

sys.exit()

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

raise SystemExit

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

dF.
источник
3
Вопрос касался закрытия окна tkinter, а не программы, использующей tkinter.
kevr
7

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

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

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

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

TreeDoNotSplit
источник
5

Подсветка при путанице ...

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

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

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

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

Мартин Гайлз
источник
3

вам нужно только ввести это:

root.destroy()

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

Быть официальным
источник
2

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

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

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()
Nukyi
источник
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()

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

import tkinter

main = Tk()

main.destroy()

main.mainloop
Джек Хамфрис
источник
1

Самый простой способ - нажать красную кнопку (крайнюю левую в 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()
Ян Габараев
источник
0
def quit1():
     root.destroy()

Button(root, text="Quit", command=quit1).pack()
root.mainloop()
user9093127
источник
0
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

Должен делать то, о чем вы просите.

Harrison Sills
источник
Привет, Харрисон, у вас есть очень поздний ответ, который не дает ничего дополнительного к существующим ответам. Хотя мы очень ценим участие, ваш ответ не дает никаких дополнительных сведений. Взгляните на некоторые другие ответы, например, они отлично объясняют, почему одни подходы работают, а другие нет.
TheOneWhoPrograms
0

Для строк меню:

def quit():
    root.destroy()

menubar = Menu(root)
filemenu = Menu(menubar, tearoff=0)

filemenu.add_separator()

filemenu.add_command(label="Exit", command=quit)
menubar.add_cascade(label="menubarname", menu=filemenu)
root.config(menu=menubar)
root.mainloop()
ЛеняКап
источник
0

Я использую следующие коды для выхода из окна Tkinter:

from tkinter import*
root=Tk()
root.bind("<Escape>",lambda q:root.destroy())
root.mainloop()

или же

from tkinter import*
root=Tk()
Button(root,text="exit",command=root.destroy).pack()
root.mainloop()

или же

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

или же

from tkinter import*
root=Tk()
Button(root,text="exit",command=exit).pack()
root.mainloop()
Курош
источник
0

Фрагмент кода ниже. Предлагаю небольшой сценарий.

import tkinter as tk
from tkinter import *

root = Tk()

def exit():
    if askokcancel("Quit", "Do you really want to quit?"):
        root.destroy()

menubar = Menu(root, background='#000099', foreground='white',
               activebackground='#004c99', activeforeground='white')

fileMenu = Menu(menubar,  tearoff=0, background="grey", foreground='black',
                activebackground='#004c99', activeforeground='white')
menubar.add_cascade(label='File', menu=fileMenu)

fileMenu.add_command(label='Exit', command=exit)

root.config(bg='#2A2C2B',menu=menubar)

if __name__ == '__main__':
    root.mainloop()

Я создал здесь пустое окно и добавил опцию меню файла в том же окне (корневом окне), где я добавляю только один вариант выхода .

Затем просто запустите mainloop для root .

Попробуй сделать это один раз

Оззиус
источник
0

root.destroyзаработает.
root.quitтоже будет работать.

В моем случае у меня было

quitButton = Button(frame, text = "Quit", command = root.destroy)

Надеюсь, поможет.

Парих Гоял
источник
0

Есть простой однострочный ответ:

Пишите - exit()в команде

Это оно!

Амай Агарвал
источник
0
from tkinter import *

def quit(root):
    root.close()

root = Tk()
root.title("Quit Window")

def quit(root):
    root.close()

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

root.mainloop()
Сарвеш
источник
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
ppwater
У вас не хватает )в вашей , buttonа также ваш вызов функции неправильно.
Cool Cloud
-1
raise SystemExit

это сработало с первой попытки, где

self.destroy()
root.destroy()

не

Программные решения Navarra
источник
-2

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

from Tkinter import *
import sys
def exitApp():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=exitApp).pack()
root.mainloop()
Сэм Бернштейн
источник
-4

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

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

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

Хосе Пабло Кастильо
источник
4
Пожалуйста, не публикуйте спекулятивные ответы. В идеале вы должны публиковать сообщения только тогда, когда у вас есть доказанный и проверяемый ответ. Если у вас есть предложения, их можно оставить в комментариях.
SuperBiasedMan
Когда вы используете класс, в моей ситуации сработало self.parent.destroy ().
Zak