Как мне завершить программу Tkinter? Допустим, у меня есть этот код:
from Tkinter import * def quit(): # code to exit root = Tk() Button(root, text=»Quit», command=quit).pack() root.mainloop()
Как я должен определить quit функция для выхода из моего приложения?
user10577 21 сен ’08 в 12:40 2008-09-21 12:40
2008-09-21 12:40
27 ответов
Вы должны использовать 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() , Пример:
Python — Tkinter GUI onclick function #python #programming #coding
from Tkinter import * def quit(): global root root.quit() root = Tk() while True: Button(root, text=»Quit», command=quit).pack() root.mainloop() #do something
user2142721 22 мар ’13 в 18:39 2013-03-22 18:39
2013-03-22 18:39
def quit() global root root.quit()
def quit() global root root.destroy()
user10577 21 сен ’08 в 12:44 2008-09-21 12:44
2008-09-21 12:44
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()
16 ноя ’08 в 18:36 2008-11-16 18:36
2008-11-16 18:36
Подсветка в случае путаницы.
def quit(self): self.destroy() exit()
A) destroy () останавливает основной цикл и убивает окно, но оставляет запущенный питон
Б) выход () останавливает весь процесс
Просто чтобы уточнить, в случае, если кто-то пропустил, что делает destroy (), и ОП также спросил, как «завершить» программу tkinter.
user6763094 26 авг ’16 в 21:22 2016-08-26 21:22
2016-08-26 21:22
Обычный метод для выхода из программы Python:
sys.exit()
(которому вы также можете передать статус выхода) или
raise SystemExit
будет хорошо работать в программе Tkinter.
user3002 21 сен ’08 в 13:24 2008-09-21 13:24
2008-09-21 13:24
Я думаю, что вы неправильно поняли функцию выхода из Tkinter. Эта функция не требует от вас определения.
Во-первых, вы должны изменить свою функцию следующим образом:
from Tkinter import * root = Tk() Button(root, text=»Quit», command=root.quit).pack() root.mainloop()
Затем вы должны использовать суффикс «.pyw», чтобы сохранить эти файлы, и дважды щелкнуть файл «.pyw», чтобы запустить ваш графический интерфейс. На этот раз вы можете завершить работу графического интерфейса одним нажатием кнопки, и вы также можете найти, что не будет неприятного окна DOS. (Если вы запустите файл ‘.py’, функция выхода завершится ошибкой.)
Create a simple GUI using Python and Tkinter 🤩 #shorts
user2788026 17 сен ’13 в 14:41 2013-09-17 14:41
2013-09-17 14:41
В случае, если кто-то хочет привязать свою кнопку Escape к закрытию всего GUI:
master = Tk() master.title(«Python») def close(event): sys.exit() master.bind(»,close) master.mainloop()
user10324360 29 окт ’18 в 08:42 2018-10-29 08:42
2018-10-29 08:42
Вам нужно всего лишь набрать это:
root.destroy()
и вам даже не нужно вызывать функцию quit(), если вы установите ее в качестве команды, то она закроет всю программу.
user10686694 05 апр ’19 в 13:05 2019-04-05 13:05
2019-04-05 13:05
Самый простой способ — нажать на красную кнопку (крайняя слева в 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()
user9612362 24 июл ’18 в 09:56 2018-07-24 09:56
2018-07-24 09:56
вам не нужно открывать функцию, чтобы закрыть окно, если вы не делаете что-то более сложное:
from Tkinter import * root = Tk() Button(root, text=»Quit», command=root.destroy).pack() root.mainloop()
28 июл ’21 в 17:58 2021-07-28 17:58
2021-07-28 17:58
Вот что вам нужно сделать, чтобы уничтожить окно:
user14672478 31 авг ’21 в 00:40 2021-08-31 00:40
2021-08-31 00:40
В idlelib.PyShell модуль, root переменная типа Tk определяется как глобальный
В конце PyShell.main() функция это вызывает root.mainloop() функция, которая является бесконечным циклом, и она работает до тех пор, пока цикл не будет прерван root.quit() функция. Следовательно, root.quit() будет только прервать выполнение mainloop
Чтобы уничтожить все виджеты, относящиеся к этому окну idlelib, root.destroy() должен быть вызван, который является последней строкой idlelib.PyShell.main() функция.
user5153622 22 май ’17 в 21:11 2017-05-22 21:11
2017-05-22 21:11
import sys from Tkinter import * def quit(): sys.exit() root = Tk() Button(root, text=»Quit», command=quit).pack() root.mainloop()
Должен делать то, что вы просите.
user7751707 04 апр ’18 в 20:01 2018-04-04 20:01
2018-04-04 20:01
Ты можешь использовать:
root.destroy()
root.quit()
Если это не сработает, измените root на то, что когда-либо было вашей переменной в начале вашей программы
import tkinter main = Tk() main.destroy() main.mainloop
user4917235 07 окт ’17 в 23:10 2017-10-07 23:10
2017-10-07 23:10
Обычно я использую tkinter quit по умолчанию, но вы можете сделать это самостоятельно, например:
from tkinter import * from tkinter.ttk import * window = Tk() window.geometry(‘700×700’) # 700p x 700p screen def quit(self): proceed = messagebox.askyesno(‘Quit’, ‘Quit?’) proceed = bool(proceed) # So it is a bool if proceed: window.quit() else: # You don’t really need to do this pass btn1 = Button(window, text=’Quit’, command=lambda: quit(None)) window.mainloop()
user16516820 26 июл ’21 в 17:03 2021-07-26 17:03
2021-07-26 17:03
Фрагмент кода ниже. Предлагаю небольшой сценарий.
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.
Попробуй сделать это один раз
user4520574 18 сен ’19 в 12:35 2019-09-18 12:35
2019-09-18 12:35
Конечно, вы можете назначить команду кнопке следующим образом, однако, если вы создаете пользовательский интерфейс, рекомендуется назначить ту же команду кнопке «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 ()
user13010024 14 фев ’21 в 21:27 2021-02-14 21:27
2021-02-14 21:27
Я использую ниже коды для выхода из окна Tkinter:
from tkinter import* root=Tk() root.bind(«»,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()
user11007580 02 май ’19 в 17:32 2019-05-02 17:32
2019-05-02 17:32
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()
user10784099 13 дек ’18 в 04:33 2018-12-13 04:33
2018-12-13 04:33
def quit1(): root.destroy() Button(root, text=»Quit», command=quit1).pack() root.mainloop()
user9093127 17 янв ’18 в 12:16 2018-01-17 12:16
2018-01-17 12:16
Button(root, text=»Quit», command=lambda:root.destroy()).pack()
user14815570 21 мар ’21 в 09:27 2021-03-21 09:27
2021-03-21 09:27
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()
27 дек ’20 в 09:38 2020-12-27 09:38
2020-12-27 09:38
root.destroy будет работать.
root.quit тоже будет работать.
В моем случае у меня было
quitButton = Button(frame, text = «Quit», command = root.destroy)
Надеюсь, это поможет.
user12354026 11 ноя ’19 в 10:22 2019-11-11 10:22
2019-11-11 10:22
Есть простой однострочный ответ:
Напишите — exit() в команде
user13298841 21 апр ’20 в 07:01 2020-04-21 07:01
2020-04-21 07:01
raise SystemExit
это сработало с первой попытки, где
self.destroy() root.destroy()
user12232151 06 фев ’20 в 20:29 2020-02-06 20:29
2020-02-06 20:29
from Tkinter import * import sys def exitApp(): sys.exit() root = Tk() Button(root, text=»Quit», command=exitApp).pack() root.mainloop()
user6486666 05 сен ’16 в 18:38 2016-09-05 18:38
2016-09-05 18:38
self.parent.destroy() self.parent.quit()
может быть, вы отправляете root как параметр в кадр, который вы сделали. поэтому, если вы хотите закончить это, вы должны позвонить своему отцу, чтобы он мог все это закрыть, вместо того, чтобы закрывать каждого из своих детей.
Источник: stackru.com
Как реализовать выход из программы с выводом сообщения об ошибке в Tkinter?
Добрый всем вечер. Недавно задали реализовать программу с графическим интерфейсом. Для этого мною была использована библиотека Tkinter. Для полноценной работы хотел сделать нормальную реакцию программы на разные ошибки, т.е. если происходит какая-то ошибка, то об этом выводится сообщение на экран, а далее программа закрывается. Реализовал я это таким образом:
if (summToPay >= maxPayment): log.after(0, print_error(‘You have exceeded the maximum payment amountn’)) root.after(5000, exit())
Но при таком раскладе программа просто завершается по истечению 5 секунд и ничего более, если же заменить exit на quit, то не происходит ничего.
Подскажите, что можно с этим сделать?
- Вопрос задан более трёх лет назад
- 1681 просмотр
2 комментария
Оценить 2 комментария
Источник: qna.habr.com
Tkinter. Всплывающие окна
Работа со всплывающими окнами – неотъемлемая составляющая работы с любым приложением. В некоторых ситуациях нет никакой необходимости в том, чтобы информационные блоки изменяли окно. Значительно проще воспользоваться отдельным окном, предназначенным для этой задачи. В том числе, сюда входит создание дополнительного окна, а также ряд других операций, которые мы рассмотрим более подробно.
Открытие дополнительного окна
Элемент Tk , как вы, возможно, знаете, являет собой основное окно. Если его уничтожить, программа попросту закрывается.
А что если необходимо создать дополнительные окна? Какой класс используется для них? Для этого применяется элемент Toplevel . С помощью этого класса возможно отображение самых разных окон, в том числе, и сложных.
Давайте для начала попробуем создать простое окошко, которое открывается по факту нажатия человеком кнопки в основном окне. В свою очередь, дополнительное окно будет закрываться по нажатию соответствующей кнопки. Выглядеть программа будет следующим образом.
Эта задача реализуется с помощью следующего кода.
import tkinter as tk class About(tk.Toplevel): def __init__(self, parent): super().__init__(parent) self.label = tk.Label(self, text=»Это всплывающее окно») self.button = tk.Button(self, text=»Закрыть», command=self.destroy) self.label.pack(padx=20, pady=20) self.button.pack(pady=5, ipadx=2, ipady=2) class App(tk.Tk): def __init__(self): super().__init__() self.btn = tk.Button(self, text=»Открыть новое окно», command=self.open_window) self.btn.pack(padx=50, pady=20) def open_window(self): about = About(self) about.grab_set() if __name__ == «__main__»: app = App() app.mainloop()