Как закрыть окно tkinter в python
Перейти к содержимому

Как закрыть окно 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()

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
  • Вопрос задан более трёх лет назад
  • 734 просмотра

Закрыть дочернее окно в tkinter

Конечно можно использовать статичный класс или глобальную перемену но это всё костыли.

Можно как-то передать в функцию объект дочернего окна?

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
def add1(): value= add2.get() name_weapon.append(str(value)) box1 = Combobox(root, width=12, textvariable=var2, values=a) window.destroy() def add(): window = Toplevel(root)# основа window.title("add new profile") # заголовок window.geometry("500x150+650+300") # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране. window.configure(bg='DimGray') # Цвет фона окна Button(window, text="Получить данные", command=add1).grid(column=0, row=1, padx=50, pady=30) # кнопка Entry(window, width=20, textvariable=add2).grid(column=0, row=0, padx=0, pady=5)

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Tkinter, ругается на Entry.get() если дочернее окно открыто из функции
_author__ = ‘Eugene’ from tkinter import * from tkinter import ttk def.

По нажатию кнопки открыть дочернее окно и закрыть родительское
Как в Tkinter Открыть дочернее окно через кнопку и закрыть родительское?

Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter?
Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter? Я пишу.

Не открывается дочернее окно
Здраствуйте, прошу помощи. Не открывается дочернее окно при нажатии 1 кнопки. А ещё при закрытии.

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

Регистрация: 19.02.2018
Сообщений: 388

у меня получает так.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
def add1(root,window): value= add2.get() name_weapon.append(str(value)) box = Combobox(root, width=12, textvariable=var1, values=name_weapon) box.grid(column=1, row=0, padx=22, pady=0) # поле со списком box.current(len(name_weapon)-1) window.destroy() add2.set('') def add(root,box): window = Toplevel(root)# основа window.title("add new profile") # заголовок window.geometry("500x150+750+400") # Первые 2 определяют ширину высоту. Пос 2 x и y координаты на экране. window.configure(bg='DimGray') # Цвет фона окна window.focus_force() e=Entry(window, width=20, textvariable=add2, takefocus=1).grid(column=0, row=0, padx=0, pady=5) Button(window, text="Добавить профиль", command= lambda:add1(root,window)).grid(column=0, row=1, padx=50, pady=30) # кнопка

как сделать поле ввода активным?

Добавлено через 50 минут
вот сделал.

1 2 3
e=Entry(window, width=20, textvariable=add2) e.grid(column=0, row=0, padx=0, pady=5) e.focus_set()

Закрыть окно клавишей esc

Закрыть дочернее окно в tkinter
Скажите пожалуйста как закрыть дочернее окно в tkinter? Конечно можно использовать статичный.

По нажатию кнопки открыть дочернее окно и закрыть родительское
Как в Tkinter Открыть дочернее окно через кнопку и закрыть родительское?

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

Закрыть окно клавишей
Закрыть окно клавишами ESC или ctrl+q, подскажите, пожалуйста, как написать такую функцию.

Эксперт Python

2885 / 1585 / 512
Регистрация: 21.02.2017
Сообщений: 4,205
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено ifgenius как решение

Решение

ifgenius,

1 2 3 4 5 6 7 8
import tkinter as tk root = tk.Tk() root.bind("", lambda event: root.destroy()) root.mainloop()

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

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