Когда есть набор классов компонентов, реализованных в виде фреймов, годится любой родительский элемент — и фреймы, и новые окна верхнего уровня. В примере 8.33 все четыре объекта демонстрационных панелей прикрепляются к собственным независимым окнам Toplevel, а не к одному и тому же контейнеру.
Пример 8.33. PP4E\Gui\Tour\demoAll-win.py
4 демонстрационных класса в независимых окнах верхнего уровня;
не процессы: при завершении одного щелчком на кнопке Quit завершаются все остальные, потому что все окна выполняются в одном и том же процессе; здесь первое окно Tk создается вручную, иначе будет создано пустое окно
from tkinter import *
demoModules = [‘demoDlg’, ‘demoRadio’, ‘demoCheck’, ‘demoScale’]
def makePopups(modnames):
demoObjects = []
for modname in modnames:
module = __import__(modname) # импортировать по имени в виде строки window = Toplevel() # создать новое окно
demo = module.Demo(window) # родительским является новое окно window.title(module.__name__)
demoObjects.append(demo)
return demoObjects
for obj in demoObjects:
if hasattr(obj, ‘report’):
print(obj.__module__, end=’ ‘)
obj.report()
root = Tk() # явно создать корневое окно
root.title(‘Popups’)
demos = makePopups(demoModules)
Label(root, text=’Multiple Toplevel window demo’, bg=’white’).pack()
Button(root, text=’States’, command=lambda: allstates(demos)).pack(fill=X) root.mainloop()
Мы уже встречались с классом Toplevel — каждый его экземпляр создает на экране новое окно. Получаемый результат изображен на рис. 8.34 — каждая демонстрационная панель выполняется не в общем, а в собственном окне.
![]() |
|
||||||||
|
||||||||
|
||||||||
|
![]() |
Главное корневое окно на этом рисунке находится в левом нижнем углу. На нем есть кнопка States, которая вызывает метод report каждого демонстрационного объекта, выводя в stdout примерно такой текст:
C:\…\PP4E\Gui\Tour> python demoAll_win.py in onMove 0 in onMove 0 in onMove 1 you pressed Open result: C:/Users/mark/Stuff/Books/4E/PP4E/dev/Examples/PP4E/Launcher.py demoRadio Open demoCheck 1 1 0 0 0 demoScale 1
Как было показано ранее в этой главе, окна Toplevel функционируют независимо друг от друга, но в действительности они не являются отдельными программами. Закрытие любого из окон на рис. 8.34 щелчком на кнопке X в правом верхнем углу закрывает только это окно. Но попытка закрыть окно щелчком на кнопке Quit или на кнопке X в главном окне закроет их все и завершит все приложение, потому что все они выполняются в одном и том же программном процессе. В некоторых приложениях это приемлемо, но не во всех. Чтобы обеспечить настоящую независимость, необходимо порождать дочерние процессы, как показано в следующем разделе.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011