Виджеты Toplevel и Tk

vidzhety toplevel i tk Экскурсия по tkinter, часть 1

Окно Toplevel напоминает Frame тем, что отщепляется в самостоятельное окно и обладает дополнительными методами, позволяющими работать со свойствами окна верхнего уровня. Виджет Tk в общем похож на виджет Toplevel, но используется для представления корневого окна приложения. Окна Toplevel имеют родителя, тогда как окно Tk — нет. Оно является настоящим корнем иерархии виджетов, создаваемых при конструировании графических интерфейсов с помощью библиотеки tkinter.

В примере 8.3 корневое окно Tk было получено даром, потому что для виджета Label был использован родитель по умолчанию, назначаемый при отсутствии первого аргумента в вызове конструктора:

Label(text=’Popups’).pack() # корневое окно Tk() по умолчанию

Передача значения None в первом аргументе конструктора виджета (или в именованном аргументе master) также приводит к назначению родителя по умолчанию. В других сценариях корневое окно Tk создается явно, например:

root = Tk()

Label(root, text=’Popups’).pack() # явное создание корневого окна Tk() root.mainloop()

В действительности, из-за того, что графические интерфейсы tkinter строятся в виде иерархии, по умолчанию всегда создается хотя бы одно корневое окно Tk, явно, как в данном примере, или нет. Хотя это и не типично, тем не менее в приложении вручную может создаваться несколько корневых окон Tk, при этом программа завершается только после закрытия всех окон Tk. Первое созданное корневое окно Tk — явно, в программном коде, или автоматически, интерпретатором, — используется как родитель по умолчанию для виджетов и других окон, при создании которых родитель не указывается.

В целом корневое окно Tk должно использоваться для отображения какой-либо информации верхнего уровня. Если не прикрепить графические элементы к корневому окну, при запуске сценария оно будет выведено как странное пустое окно (часто это происходит из-за забывчивости, когда программист создает виджеты, использующие родителя по умолчанию, но забывает вызвать метод компоновщика, выполняющий размещение виджетов). Технически можно подавить создание корневого окна по умолчанию и создать несколько корневых окон с помощью виджета Tk, как показано в примере 8.4.

Пример 8.4. PP4E\Gui\Tour\toplevel1.py

import tkinter

from tkinter import Tk, Button

tkinter.NoDefaultRoot()

win1 = Tk() # два независимых корневых окна

win2 = Tk()

Button(win1, text=’Spam’, command=win1.destroy).pack()

Button(win2, text=’SPAM’, command=win2.destroy).pack() win1.mainloop()

Если запустить этот сценарий, он создаст только два окна, изображенные на рис. 8.3 (третье корневое окно не будет создано). Но чаще корневой объект Tk используется как главное окно, а виджеты Toplevel — как всплывающие окна приложения.

Обратите внимание: чтобы закрыть только одно окно, вместо функции sys.exit, которая завершает работу всей программы, вызывается метод destroy этого окна — чтобы понять, как действует этот метод, перейдем к изучению протоколов окна.

Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011

Оцените статью
Секреты программирования
Добавить комментарий