





def quit()
root.quit()
или же
def quit()
root.destroy()
извините, я нашел ответ и просто подумал, что поделюсь им. Лучше использовать root.destroy(), поскольку он завершает основной цикл программы. См .: http://www.daniweb.com/software-development/python/threads/6 6698
Обычный способ выхода из программы Python:
sys.exit()
(которому вы также можете передать статус выхода) или
raise SystemExit
будет нормально работать в программе Tkinter.
Вопрос касался закрытия окна tkinter, а не программы, использующей tkinter.
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 (), как можно позже снова найти окно в другом сценарии, который будет уничтожен (чтобы не продолжать использовать системные ресурсы)?
Ваше первое утверждение неверно. вызов quit уничтожит все виджеты; если виджеты уничтожены, mainloop выйдет.
После некоторого исследования я считаю, что это также относится ко ВСЕМ выполняемому коду. Поэтому, если у вас есть mainloop () TKinter в сценарии командной строки, используйте root.quit (), а не root.destroy (), иначе ваш сценарий командной строки не будет продолжать выполнение кода после mainloop (). Я протестировал это, и он у меня работает (я знаю, что TKinter не предназначен для использования в таком дизайне, но он работает)
это хорошее решение, чтобы уничтожить окно Tkinter много раз и запускать много раз
Я думаю, вы неправильно поняли функцию выхода из 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()
возможно, вы отправляете корневой параметр во фрейм, который вы сделали. поэтому, если вы хотите закончить его, вы должны вызвать своему отцу, чтобы он мог закрыть все это, вместо того, чтобы закрывать каждого из своих детей.
Пожалуйста, не публикуйте спекулятивные ответы. В идеале вы должны публиковать сообщения только тогда, когда у вас есть доказанный и поддающийся проверке ответ. Если у вас есть предложения, их можно оставить в комментариях.
Когда вы используете класс, в моей ситуации сработало self.parent.destroy ().
Подсветка в случае неразберихи ...
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()
Должен делать то, о чем вы просите.
Привет, Харрисон, у вас есть очень поздний ответ, который не дает ничего лишнего по сравнению с существующими ответами. Хотя мы очень ценим участие, ваш ответ не дает никаких дополнительных сведений. Взгляните на некоторые другие ответы, например, они отлично объясняют, почему одни подходы работают, а другие нет.
Самый простой способ - нажать красную кнопку (крайнюю левую в 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()
Хотя этот код может ответить на вопрос, предоставление дополнительного контекста относительно того, как и / или почему он решает проблему, улучшит долгосрочную ценность ответа.
Вам не хватает ) в вашем button, а также вы неправильно вызываете функцию.
Конечно, вы можете назначить команду кнопке следующим образом, однако, если вы создаете пользовательский интерфейс, рекомендуется назначить ту же команду кнопке «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 ()
знает ли кто-нибудь, какой метод более «правильный», или один из них более читабелен, чем другой