Окна
По умолчанию приложение 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
- Вопрос задан более трёх лет назад
- 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, подскажите, пожалуйста, как написать такую функцию.
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()