Як закрити вікно tkinter?


83

Як закінчити програму Tkinter? Скажімо, у мене є такий код:

from Tkinter import *

def quit():
    # code to exit

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

Як мені визначити quitфункцію виходу з моєї програми?

Відповіді:


116

Ви повинні використовувати, 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 (), як можна пізніше знову знайти вікно в іншому сценарії, який потрібно знищити (щоб не продовжувати використовувати системні ресурси)?
Радж,

3
Ваше перше твердження хибне. виклик quitзнищить усі віджети; якщо віджети будуть знищені, mainloopвийдуть.
Bryan Oakley

1
Після деяких досліджень, я вважаю, що це також стосується ВСІХ кодів, що виконуються. Отже, якщо у вас є mainloop () TKinter у сценарії командного рядка, використовуйте root.quit (), а не root.destroy (), інакше ваш сценарій командного рядка не буде продовжувати виконувати код після mainloop (). Я перевірив це, і це працює для мене (я знаю, що TKinter не призначений для використання в такому дизайні, тим не менш, він працює)
Олексій

чи є хорошим рішенням багато разів знищувати вікно Tkinter і починати багато разів
Nitesh Waghmare

40
def quit()
    root.quit()

або

def quit()
    root.destroy()

чи хтось знає, який метод є більш "правильним", або випадок, коли один є більш читабельним, ніж інший
Опал

8
вибачте, я знайшов відповідь і просто подумав, що поділюсь нею. Краще використовувати, root.destroy()оскільки він завершує основний цикл програми. Див .: http://www.daniweb.com/software-development/python/threads/66698
Опал

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.
кевр

7

Думаю, ви неправильно зрозуміли функцію виходу Ткінтера. Ця функція не вимагає від вас визначення.

По-перше, вам слід змінити свою функцію наступним чином:

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) знищення () зупиняє головний цикл і вбиває вікно, але залишає запущений python

B) exit () зупиняє весь процес

Просто для роз’яснення на випадок, якщо хтось пропустив те, що робить знищувач (), і ОР також запитав, як "завершити" програму 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)

Сподіваюся, це допоможе.




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

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


4
Будь ласка, не публікуйте спекулятивні відповіді. В ідеалі ви повинні розміщувати повідомлення лише тоді, коли у вас є перевірена і перевірена відповідь. Якщо у вас є пропозиції, вони можуть залишити коментар.
SuperBiased,

Коли ви використовуєте клас, self.parent.destroy () - це те, що спрацювало в моїй ситуації.
Зак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.