Как закрыть окно 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

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()

7

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

sys.exit()

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

raise SystemExit

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


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, функция выхода завершится ошибкой.)


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()

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
import sys
from Tkinter import *
def quit():
    sys.exit()
root = Tk()
Button(root, text="Quit", command=quit).pack()
root.mainloop()

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


Привет, Харрисон, у вас есть очень поздний ответ, который не дает ничего дополнительного к существующим ответам. Хотя мы очень ценим участие, ваш ответ не дает никаких дополнительных сведений. Взгляните на некоторые другие ответы, например, они отлично объясняют, почему одни подходы работают, а другие нет.
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
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



-4

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

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

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


4
Пожалуйста, не публикуйте спекулятивные ответы. В идеале вы должны публиковать сообщения только тогда, когда у вас есть доказанный и проверяемый ответ. Если у вас есть предложения, их можно оставить в комментариях.
SuperBiasedMan

Когда вы используете класс, в моей ситуации сработало self.parent.destroy ().
Zak
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.