Сочетание grid и pack

sochetanie grid i pack Экскурсия по tkinter, часть 2

Обратите внимание, что в примере 9.19 каждой функции-конструктору формы передается совершенно новый виджет Toplevel, благодаря чему версии на основе методов grid и pack создают различные окна верхнего уровня. Так как два менеджера компоновки не могут одновременно использоваться в одном родительском окне, необходимо следить за тем, чтобы по недосмотру не смешать их. Пример 9.20 демонстрирует возможность компоновки виджетов с помощью методов pack и grid в одном и том же окне, но только после заключения их в отдельные контейнерные виджеты Frame.

Пример 9.20. PP4E\Gui\Tour\Grid\grid2-same.py

создает формы с применением методов pack и grid в отдельных фреймах в одном и том же окне; методы grid и pack не могут одновременно использоваться в одном родительском контейнере (например, в корневом окне), но могут использоваться в разных фреймах в одном и том же окне;

from tkinter import *

from grid2 import gridbox, packbox

root = Tk()

Label(root, text=’Grid:’).pack()

frm = Frame(root, bd=5, relief=RAISED)

frm.pack(padx=5, pady=5)

gridbox(frm)

Label(root, text=’Pack:’).pack()

frm = Frame(root, bd=5, relief=RAISED)

frm.pack(padx=5, pady=5)

packbox(frm)

Button(root, text=’Quit’, command=root.quit).pack()

mainloop()

Если запустить этот сценарий, получится составное окно с двумя формами идентичного вида (рис. 9.31), но эти два вложенные фрейма в действительности управляются совершенно разными менеджерами компоновки.

C другой стороны, такой программный код, как приводится в примере 9.21, вызывает грубую ошибку, поскольку пытается вызывать методы pack и grid в одном и том же родителе — только один менеджер компоновки может использоваться в каждом отдельном родительском окне.

Пример 9.21. PP4E\Gui\Tour\Grid\grid2-fails.py

ОШИБКА — методы pack и grid не могут одновременно использоваться в одном и том же родительском контейнере (здесь, корневое окно)

from tkinter import *

from grid2 import gridbox, packbox

root = Tk()

gridbox(root)

packbox(root)

Рис. 9.31. grid и pack в одном окне

 

Button(root, text=’Quit’, command=root.quit).pack() mainloop()

Этот сценарий передает каждой из функций одного и того же родителя (окно верхнего уровня), пытаясь вывести обе формы в одном окне. На моей машине он полностью подвешивает процесс Python, не выводя вообще никаких окон (в некоторых версиях Windows мне пришлось прибегнуть к Ctrl+Alt+Delete, чтобы уничтожить процесс, в других версиях достаточно было перезапустить программу Командная строка (Command Prompt)).

Комбинирование менеджеров компоновки может представлять сложность, пока с этим не освоишься. Чтобы сделать этот сценарий работоспособным, например, требуется просто изолировать форму с сеткой в собственном родительском контейнере, чтобы оградить его от влияния метода pack, используемого в корневом окне, — как демонстрирует следующая альтернативная реализация, где изменения выделены полужирным шрифтом:

root = Tk()

frm = Frame(root)

frm.pack() # это работает

gridbox(frm) # у gridbox должен быть собственный родитель

packbox(root)

Button(root, text=’Quit’, command=root.quit).pack() mainloop()

Еще раз напомню, что в настоящее время внутри одного родителя допускается использовать либо метод pack, либо метод grid, но не тот и другой одновременно. Возможно, в будущем это давнее ограничение будет снято, что, впрочем, маловероятно с учетом различий в схемах двух менеджеров компоновки, но на всякий случай проверьте свою версию Python.

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

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