Перейти к содержимому

Как закрыть окно tkinter в python

  • автор:

Окна

По умолчанию приложение 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, у него устанавливается заголовок и размеры.

Создание окон в Tkinter и Python

Стоит отметить, что приложение завершит работу, когда будут закрыты все его окна.

Как и главное окно, вторичные окна могут иметь виджеты. Например, определим на новом окне метку:

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

Единственное не надо забывать у добавляемых виджетов устанавливать окно в качестве родительского контейнера

Создание окон Tk в Tkinter и Python

Удаление окна

Для удаления окна применяется ме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 окно через время

Открывается окно, в что-то написано. Через 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 бронзовых знака

Как закрыть окно Tkinter с помощью кнопки?

Модуль Python Tkinter предлагает функцию Button для создания кнопки в окне Tkinter для выполнения любой задачи после нажатия кнопки. Задачу можно назначить в параметре command функции Button () . Ниже приведены различные методы, с помощью которых это может быть достигнуто.

Метод 1: использование неклассового метода destroy ()

  • Импортируйте модуль tkinter.
  • Создайте главное окно с именем root.
  • Добавьте кнопку.
  • Назначьте root.destroy атрибуту команды этой кнопки.

Python3

# Python program to create a close button

# using destroy Non-Class method

Закрытие предыдущего окна при открытии нового

Во время написания кода на Tkinter с помощью ЯП python версии 3.8.0 встретился с проблемой: не закрывается предыдущее окно программы. То есть при нажатии на кнопки предыдущее окно должно закрываться и открываться новое, но нигде не могу найти решение этой проблемы. Как можно решить эту проблему? Код прилагается:

import tkinter as tk class Main(tk.Tk): def __init__(self,*args, **kwargs): tk.Tk.__init__(self,*args, *kwargs) self.title("Электронный формуляр") self.geometry("900x450+300+200") self.resizable(False, False) #Кнопка "Ученик" self.button = tk.Button(self,text="Ученик", command=lambda: SW()) self.button.place(x=100,y=150) #Кнопка "Учитель" self.button1 = tk.Button(self,text="Учитель", command=lambda: TW()) self.button1.place(x=100,y=200) #Кнопка "Другой посетитель" self.button2 = tk.Button(self,text="Другой посетитель", command=lambda: FW()) self.button2.place(x=100,y=250) #Кнопка "Добавить книги в ЧБ" self.btn_add=tk.Button(self, text='Добавить книги в ЧБ',command=lambda: Main()) self.btn_add.place(x=56, y=70) #Кнопка "Просмотреть ЧБ" self.btn_watch=tk.Button(self, text='Просмотреть ЧБ',command=lambda: Watch()) self.btn_watch.place(x=185, y=70) #Кнопка "Уведомления" self.btn_notif=tk.Button(self, text='Уведомления',command=lambda: Not()) self.btn_notif.place(x=291, y=70) class SW(tk.Toplevel): def __init__(self,*args, **kwargs): tk.Toplevel.__init__(self,*args, *kwargs) self.title("Ученик") self.geometry("900x450+300+200") self.resizable(False, False) #кнопка "Добавить книги в ЧБ" self.btn_add=tk.Button(self, text='Добавить книги в ЧБ', command=lambda: Main()) self.btn_add.place(x=56, y=70) #кнопка "Посмотреть ЧБ" self.btn_watch=tk.Button(self, text='Просмотреть ЧБ',command=lambda: Watch()) self.btn_watch.place(x=185, y=70) #кнопка "Уведомления" self.btn_notif=tk.Button(self, text='Уведомления',command=lambda: Not()) self.btn_notif.place(x=291, y=70) #кнопка "Сохранить" self.btn_save=tk.Button(self, text='Сохранить') self.btn_save.place(x=800, y=415) #место ввода "ФИО" self.en_fio=tk.Entry(self,width=25) self.en_fio.place_configure(x=56, y=140) #место ввода "Класс" self.en_class=tk.Entry(self,width=3) self.en_class.place_configure(x=257, y=140) #место ввода "Литера" self.en_lit=tk.Entry(self,width=3) self.en_lit.place_configure(x=355, y=140) #надпись "ФИО" self.lb_fio=tk.Label(text='ФИО') self.lb_fio.place(x=26,y=140) #надпись "Класс" self.lb_class=tk.Label(text='Класс') self.lb_class.place(x=220,y=140) #надпись "Литера" self.lb_lit=tk.Label(text='Литера') self.lb_lit.place(x=310,y=140) class TW(SW): def __init__(self,*args, **kwargs): tk.Toplevel.__init__(self,*args, *kwargs) self.title("Учитель") self.geometry("900x450+300+200") #кнопка "Добавить книги в ЧБ" self.btn_add=tk.Button(self, text='Добавить книги в ЧБ', command=lambda: Main()) self.btn_add.place(x=56, y=70) #кнопка "Посмотреть ЧБ" self.btn_watch=tk.Button(self, text='Просмотреть ЧБ',command=lambda: Watch()) self.btn_watch.place(x=185, y=70) #кнопка "Уведомления" self.btn_notif=tk.Button(self, text='Уведомления',command=lambda: Not()) self.btn_notif.place(x=291, y=70) #кнопка "Сохранить" self.btn_save=tk.Button(self, text='Сохранить') self.btn_save.place(x=800, y=415) #надпись "ФИО" self.lb_fio=tk.Label(text='ФИО') self.lb_fio.place(x=26,y=140) #место ввода "ФИО" self.en_fio=tk.Entry(self,width=25) self.en_fio.place_configure(x=56, y=140) class FW(tk.Toplevel): def __init__(self,*args, **kwargs): tk.Toplevel.__init__(self,*args, *kwargs) self.title("Другой посетитель") self.geometry("900x450+300+200") self.resizable(False, False) #кнопка "Добавить книги в ЧБ" self.btn_add=tk.Button(self, text='Добавить книги в ЧБ', command=lambda: Main()) self.btn_add.place(x=56, y=70) #кнопка "Посмотреть ЧБ" self.btn_watch=tk.Button(self, text='Просмотреть ЧБ',command=lambda: Watch()) self.btn_watch.place(x=185, y=70) #кнопка "Уведомления" self.btn_notif=tk.Button(self, text='Уведомления',command=lambda: Not()) self.btn_notif.place(x=291, y=70) #кнопка "Сохранить" self.btn_save=tk.Button(self, text='Сохранить') self.btn_save.place(x=800, y=415) #надпись "ФИО" self.lb_fio=tk.Label(text='ФИО') self.lb_fio.place(x=26,y=140) #место ввода "ФИО" self.en_fio=tk.Entry(self,width=25) self.en_fio.place_configure(x=56, y=140) class Not(tk.Toplevel): def __init__(self,*args, **kwargs): tk.Toplevel.__init__(self,*args, *kwargs) self.title("Другой посетитель") self.geometry("900x450+300+200") self.resizable(False, False) class Watch(tk.Toplevel): def __init__(self,*args, **kwargs): tk.Toplevel.__init__(self,*args, *kwargs) self.title("Другой посетитель") self.geometry("900x450+300+200") self.resizable(False, False) if __name__ == "__main__": app = Main() app.mainloop() 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *