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

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

from Tkinter import *

def quit():
    # code to exit

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

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

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
90
0
308 531
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

def quit()
    root.quit()

или же

def quit()
    root.destroy()

знает ли кто-нибудь, какой метод более «правильный», или один из них более читабелен, чем другой

Opal 07.05.2011 07:09

извините, я нашел ответ и просто подумал, что поделюсь им. Лучше использовать root.destroy(), поскольку он завершает основной цикл программы. См .: http://www.daniweb.com/software-development/python/threads/6‌ 6698

Opal 07.05.2011 07:13

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

sys.exit()

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

raise SystemExit

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

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

kevr 30.01.2020 06:00

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()
Ответ принят как подходящий

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

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

Raj 29.06.2016 03:14

Ваше первое утверждение неверно. вызов quit уничтожит все виджеты; если виджеты уничтожены, mainloop выйдет.

Bryan Oakley 12.11.2016 03:38

После некоторого исследования я считаю, что это также относится ко ВСЕМ выполняемому коду. Поэтому, если у вас есть mainloop () TKinter в сценарии командной строки, используйте root.quit (), а не root.destroy (), иначе ваш сценарий командной строки не будет продолжать выполнение кода после mainloop (). Я протестировал это, и он у меня работает (я знаю, что TKinter не предназначен для использования в таком дизайне, но он работает)

Alex 20.12.2017 09:30

это хорошее решение, чтобы уничтожить окно Tkinter много раз и запускать много раз

Nitesh Waghmare 18.02.2020 14:36

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

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

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

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

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

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

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

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

SuperBiasedMan 27.05.2015 14:04

Когда вы используете класс, в моей ситуации сработало self.parent.destroy ().

Zak 04.02.2016 04:11

Подсветка в случае неразберихи ...

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

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

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

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

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

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

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

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

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

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

root.destroy()

Или же

root.quit()

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

import tkinter

main = Tk()

main.destroy()

main.mainloop

def quit1():
     root.destroy()

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

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

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

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

TheOneWhoPrograms 04.04.2018 23:39

Самый простой способ - нажать красную кнопку (крайнюю левую в 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()

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

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

def close(event):
    sys.exit()

master.bind('<Escape>',close)
master.mainloop()

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

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

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

root.destroy()

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

Я использую следующие коды для выхода из окна 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()

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

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

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

Тогда просто запустить основной цикл вместо корень.

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

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

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

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

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

raise SystemExit

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

self.destroy()
root.destroy()

не

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

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

Вот и все!

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 27.12.2020 10:27

Вам не хватает ) в вашем button, а также вы неправильно вызываете функцию.

Cool Cloud 27.12.2020 10:47

Конечно, вы можете назначить команду кнопке следующим образом, однако, если вы создаете пользовательский интерфейс, рекомендуется назначить ту же команду кнопке «X»:

def quit(self): # Your exit routine
   self.root.destroy()

self.root.protocol("WM_DELETE_WINDOW", self.quit) # Sets the command for the "X" button 

Button(text = "Quit", command=self.quit) # No ()

Другие вопросы по теме