Окна
По умолчанию приложение Tkinter имеет одно главное окно, которое представляет класс tkinter.Tk . Запуск приложение приводит к запуску главного окно, в рамках которого помещаются все виджеты. Закрытие главного окна приводит к завершению работы приложения. Однако в рамках главного окна также можно запускать вторичные, неглавные окна. Например, октроем новое окно по нажатию на кнопку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()
Здесь по нажатию на кнопку создается новый объект window, у него устанавливается заголовок и размеры.

Стоит отметить, что приложение завершит работу, когда будут закрыты все его окна.
Как и главное окно, вторичные окна могут иметь виджеты. Например, определим на новом окне метку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") label=ttk.Label(window, text="Принципиально новое окно") label.pack(anchor=CENTER, expand=1) button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()
Единственное не надо забывать у добавляемых виджетов устанавливать окно в качестве родительского контейнера

Удаление окна
Для удаления окна применяется меnод destroy()
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") close_button = ttk.Button(window, text="Закрыть окно", command=lambda: window.destroy()) close_button.pack(anchor="center", expand=1) open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
В данном случае в новом окне по нажатию на кнопку close_button срабатывает метод window.destroy() , который закрывает окно и по сути аналогичен нажатию на крестик в верхнем правом углу окна.
Определение окна в объектно-ориентированном стиле
В примере выше новое окно, его параметры и вложенные виджеты определялись внутри функции, однако это приводит к разбуханию кода функции. И гораздо проще вынести определение окна в отдельный класс:
from tkinter import * from tkinter import ttk class Window(Tk): def __init__(self): super().__init__() # конфигурация окна self.title("Новое окно") self.geometry("250x200") # определение кнопки self.button = ttk.Button(self, text="закрыть") self.button["command"] = self.button_clicked self.button.pack(anchor="center", expand=1) def button_clicked(self): self.destroy() root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Window() open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
Здесь определение окна вынесено в отдельный класс Window, который наследуется от класса tkinter.Tk. Благодаря этому мы можем вынести весь код определения окна в отдельную структурную единицу — класс, что позволит упростить управление кодом.
Окно поверх других окон
Для создания диалогового окна, которое располагается поверх главного окна, применяется класс Toplevel :
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def dismiss(window): window.grab_release() window.destroy() def click(): window = Toplevel() window.title("Новое окно") window.geometry("250x200") window.protocol("WM_DELETE_WINDOW", lambda: dismiss(window)) # перехватываем нажатие на крестик close_button = ttk.Button(window, text="Закрыть окно", command=lambda: dismiss(window)) close_button.pack(anchor="center", expand=1) window.grab_set() # захватываем пользовательский ввод open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
Toplevel по сути то же самое окно Tk, которое располагается поверх других окон. В примере выше оно также имеет кнопку. Но кроме того, чтобы пользователь не мог перейти обратно к главному окну пока не закроет это диалоговое окно, применяется ряд методов. Прежде всего захватываем весь пользовательский ввод с помощью метода grab_set() :
window.grab_set()
В функции dismiss() , которая закрывает окно, освобождаем ввод с помощью метода grab_release()
window.grab_release()
Python. Как гарантированно закрыть поток закрытием окна Tkinter?
Подскажите пожалуйста как гарантированно закрыть созданный отдельный поток после закрытия окна Tkinter? Вот такая конструкция работает, но в случае вылета по исключению может не перешагнуть window.mainloop() и поток продолжит молотить, проверено.
from tkinter import * import threading, time run = True def clik(): while run: print('loop') time.sleep(2) Potok = threading.Thread(target = clik) window = Tk() window.geometry('300x300+500+500') window.title("Thread Loop") btn = Button(window, text="Старт!", command = lambda: Potok.start()) btn.grid(column=1, row=0) window.mainloop() run = False
- Вопрос задан более трёх лет назад
- 799 просмотров
Как закрыть tkinter окно через время
Открывается окно, в что-то написано. Через 5 секунд оно должно завершится,как мне это сделать? Ещё надо учитывать что это как доп. окно, то-есть есть ещё одно окно, которое должно продолжить работу. Вот код с окном которое должно завершится:
from tkinter import * import time window = Tk() window.title("123") window.overrideredirect(1) lblc = Label(window, text="Внимание:недостаточно кликов для X2",font=("Arial Bold", 15), background="SystemWindow") lblc.grid(column=0, row=0) window.mainloop()
Отслеживать
задан 19 апр 2020 в 22:29
user383587 user383587
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Можно запустить window.destroy() с отложенным исполнением при помощи window.after()
window.after(5000, window.destroy) window.mainloop()
Отслеживать
ответ дан 19 апр 2020 в 22:36
16.4k 2 2 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака
Close a Tkinter Window With a Button

- root.destroy() Class Method to Close the Tkinter Window
- destroy() Non-Class Method to Close the Tkinter Window
- Associate root.destroy Function to the command Attribute of the Button Directly
- root.quit to Close the Tkinter Window
We can use a function or command attached to a Tkinter button in the Tkinter GUI to close the Tkinter window when the user clicks it.
root.destroy() Class Method to Close the Tkinter Window
try: import Tkinter as tk except: import tkinter as tk class Test: def __init__(self): self.root = tk.Tk() self.root.geometry("100x50") button = tk.Button(self.root, text="Click and Quit", command=self.quit) button.pack() self.root.mainloop() def quit(self): self.root.destroy() app = Test()
destroy() method destroys or closes the window. We make a separate quit method and then bind it to the command of the button.
We could also directly set the command argument to be self.root.destroy as below.
try: import Tkinter as tk except: import tkinter as tk class Test: def __init__(self): self.root = tk.Tk() self.root.geometry("100x50") button = tk.Button(self.root, text="Click and Quit", command=self.root.destroy) button.pack() self.root.mainloop() def quit(self): self.root.destroy() app = Test()

destroy() Non-Class Method to Close the Tkinter Window
try: import Tkinter as tk except: import tkinter as tk root = tk.Tk() root.geometry("100x50") def close_window(): root.destroy() button = tk.Button(text="Click and Quit", command=close_window) button.pack() root.mainloop()
Associate root.destroy Function to the command Attribute of the Button Directly
We could directly bind root.destroy function to the button command attribute without defining the extra function close_window any more.
try: import Tkinter as tk except: import tkinter as tk root = tk.Tk() root.geometry("100x50") button = tk.Button(text="Click and Quit", command=root.destroy) button.pack() root.mainloop()
root.quit to Close the Tkinter Window
root.quit quits not only the Tkinter Window but, more precisely, the whole Tcl interpreter.
It could be used if your Tkinter app is not initiated from Python IDLE . We don’t recommend to use root.quit if your Tkinter app is called from IDLE because quit will kill not only your Tkinter app but also the IDLE because IDLE is also a Tkinter application.
try: import Tkinter as tk except: import tkinter as tk root = tk.Tk() root.geometry("100x50") button = tk.Button(text="Click and Quit", command=root.quit) button.pack() root.mainloop()
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
Related Article — Tkinter Button
- Pass Arguments to Tkinter Button Command
- Change Tkinter Button State
- Bind Multiple Commands to Tkinter Button
- Create a New Window by Clicking a Button in Tkinter
- Change the Tkinter Button Size
Окна
По умолчанию приложение Tkinter имеет одно главное окно, которое представляет класс tkinter.Tk . Запуск приложение приводит к запуску главного окно, в рамках которого помещаются все виджеты. Закрытие главного окна приводит к завершению работы приложения. Однако в рамках главного окна также можно запускать вторичные, неглавные окна. Например, октроем новое окно по нажатию на кнопку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()
Здесь по нажатию на кнопку создается новый объект window, у него устанавливается заголовок и размеры.

Стоит отметить, что приложение завершит работу, когда будут закрыты все его окна.
Как и главное окно, вторичные окна могут иметь виджеты. Например, определим на новом окне метку:
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") label=ttk.Label(window, text="Принципиально новое окно") label.pack(anchor=CENTER, expand=1) button = ttk.Button(text="Создать окно", command=click) button.pack(anchor=CENTER, expand=1) root.mainloop()
Единственное не надо забывать у добавляемых виджетов устанавливать окно в качестве родительского контейнера

Удаление окна
Для удаления окна применяется меnод destroy()
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Tk() window.title("Новое окно") window.geometry("250x200") close_button = ttk.Button(window, text="Закрыть окно", command=lambda: window.destroy()) close_button.pack(anchor="center", expand=1) open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
В данном случае в новом окне по нажатию на кнопку close_button срабатывает метод window.destroy() , который закрывает окно и по сути аналогичен нажатию на крестик в верхнем правом углу окна.
Определение окна в объектно-ориентированном стиле
В примере выше новое окно, его параметры и вложенные виджеты определялись внутри функции, однако это приводит к разбуханию кода функции. И гораздо проще вынести определение окна в отдельный класс:
from tkinter import * from tkinter import ttk class Window(Tk): def __init__(self): super().__init__() # конфигурация окна self.title("Новое окно") self.geometry("250x200") # определение кнопки self.button = ttk.Button(self, text="закрыть") self.button["command"] = self.button_clicked self.button.pack(anchor="center", expand=1) def button_clicked(self): self.destroy() root = Tk() root.title("METANIT.COM") root.geometry("250x200") def click(): window = Window() open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
Здесь определение окна вынесено в отдельный класс Window, который наследуется от класса tkinter.Tk. Благодаря этому мы можем вынести весь код определения окна в отдельную структурную единицу — класс, что позволит упростить управление кодом.
Окно поверх других окон
Для создания диалогового окна, которое располагается поверх главного окна, применяется класс Toplevel :
from tkinter import * from tkinter import ttk root = Tk() root.title("METANIT.COM") root.geometry("250x200") def dismiss(window): window.grab_release() window.destroy() def click(): window = Toplevel() window.title("Новое окно") window.geometry("250x200") window.protocol("WM_DELETE_WINDOW", lambda: dismiss(window)) # перехватываем нажатие на крестик close_button = ttk.Button(window, text="Закрыть окно", command=lambda: dismiss(window)) close_button.pack(anchor="center", expand=1) window.grab_set() # захватываем пользовательский ввод open_button = ttk.Button(text="Создать окно", command=click) open_button.pack(anchor="center", expand=1) root.mainloop()
Toplevel по сути то же самое окно Tk, которое располагается поверх других окон. В примере выше оно также имеет кнопку. Но кроме того, чтобы пользователь не мог перейти обратно к главному окну пока не закроет это диалоговое окно, применяется ряд методов. Прежде всего захватываем весь пользовательский ввод с помощью метода grab_set() :
window.grab_set()
В функции dismiss() , которая закрывает окно, освобождаем ввод с помощью метода grab_release()
window.grab_release()
Как совершить закрытие окна(Tkinter)?
В данном коде присутствует функция add. Что надо прописать чтобы при выполнении этой функции совершалось закрытие данного окна и открытие следующего или замена данного окна другим?(все комментарии стоят перед кнопкой/подписью/местом ввода текста)
from subprocess import call import tkinter as tk from tkinter import ttk class Main(tk.Frame): def __init__(self,root): super().__init__(root,background="royal blue") self.pack(fill=tk.BOTH, expand=1) #кнопка "Добавить книги в ЧБ" btn_add=ttk.Button(self, text='Добавить книги в ЧБ', command=add) btn_add.place(x=56, y=70) #кнопка "Посмотреть ЧБ" btn_watch=ttk.Button(self, text='Просмотреть ЧБ',command=watch) btn_watch.place(x=185, y=70) #кнопка "Уведомления" btn_notif=ttk.Button(self, text='Уведомления',command=notif) btn_notif.place(x=291, y=70) #кнопка "Сохранить" btn_save=ttk.Button(self, text='Сохранить',command=save) btn_save.place(x=800, y=415) #надпись "ФИО" lb_fio=ttk.Label(text='ФИО',foreground='black',background='royal blue') lb_fio.place(x=26,y=140) #надпись "Класс" lb_class=ttk.Label(text='Класс',foreground='black',background='royal blue') lb_class.place(x=220,y=140) #надпись "Литера" lb_lit=ttk.Label(text='Литера',foreground='black',background='royal blue') lb_lit.place(x=310,y=140) #место ввода "ФИО" en_fio=ttk.Entry(self,width=25) en_fio.place_configure(x=56, y=140) #место ввода "Класс" en_class=ttk.Entry(self,width=3) en_class.place_configure(x=257, y=140) #место ввода "Литера" en_lit=ttk.Entry(self,width=3) en_lit.place_configure(x=355, y=140) def add(): call(['python','H:\project\lib\lar3\cods\gl.py']) def notif(): pass def watch(): pass def save(): pass if __name__ == '__main__': root=tk.Tk() app=Main(root) app.pack() root.title('Электронный формуляр') root.geometry("900x450+300+200") root.resizable(False, False) root.mainloop()
- Вопрос задан более трёх лет назад
- 1532 просмотра
Python. Как гарантированно закрыть поток закрытием окна Tkinter?
Подскажите пожалуйста как гарантированно закрыть созданный отдельный поток после закрытия окна Tkinter? Вот такая конструкция работает, но в случае вылета по исключению может не перешагнуть window.mainloop() и поток продолжит молотить, проверено.
from tkinter import * import threading, time run = True def clik(): while run: print('loop') time.sleep(2) Potok = threading.Thread(target = clik) window = Tk() window.geometry('300x300+500+500') window.title("Thread Loop") btn = Button(window, text="Старт!", command = lambda: Potok.start()) btn.grid(column=1, row=0) window.mainloop() run = False
- Вопрос задан более трёх лет назад
- 799 просмотров
Как закрыть tkinter окно через время
Открывается окно, в что-то написано. Через 5 секунд оно должно завершится,как мне это сделать? Ещё надо учитывать что это как доп. окно, то-есть есть ещё одно окно, которое должно продолжить работу. Вот код с окном которое должно завершится:
from tkinter import * import time window = Tk() window.title("123") window.overrideredirect(1) lblc = Label(window, text="Внимание:недостаточно кликов для X2",font=("Arial Bold", 15), background="SystemWindow") lblc.grid(column=0, row=0) window.mainloop()
Отслеживать
задан 19 апр 2020 в 22:29
user383587 user383587
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Можно запустить window.destroy() с отложенным исполнением при помощи window.after()
window.after(5000, window.destroy) window.mainloop()
Отслеживать
ответ дан 19 апр 2020 в 22:36
16.4k 2 2 золотых знака 15 15 серебряных знаков 24 24 бронзовых знака