Сравнение методов grid и pack

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

Настало время сделать некоторые сравнения и противопоставления: пример 9.19 реализует одинаковые расцвеченные формы ввода с помощью методов grid и pack, чтобы легче было обнаружить различия между двумя подходами.

Пример 9.19. PP4E\Gui\Tour\Grid\grid2.py

добавляет эквивалентное окно, используя фреймы-ряды и метки фиксированной длины; использование фреймов-колонок не обеспечивает точного взаимного расположения виджетов Label и Entry по горизонтали; программный код в обоих случаях имеет одинаковую длину, хотя применение встроенной функции enumerate позволило бы сэкономить 2 строки в реализации компоновки по сетке;

from tkinter import *

colors = [‘red’, ‘green’, ‘orange’, ‘white’, ‘yellow’, ‘blue’]

def gridbox(parent):

“компоновка по номерам рядов/колонок в сетке” row = 0

for color in colors:

lab = Label(parent, text=color, relief=RIDGE, width=25)

ent = Entry(parent, bg=color, relief=SUNKEN, width=50)

lab.grid(row=row, column=0)

ent.grid(row=row, column=1) ent.insert(0, ‘grid’) row += 1

def packbox(parent):

“фреймы-ряды и метки фиксированной длины”

for color in colors:

row = Frame(parent)

lab = Label(row, text=color, relief=RIDGE, width=25)

ent = Entry(row, bg=color, relief=SUNKEN, width=50) row.pack(side=TOP) lab.pack(side=LEFT) ent.pack(side=RIGHT) ent.insert(0, ‘pack’)

if __name__ == ‘__main__’:

root = Tk()

gridbox(Toplevel())

packbox(Toplevel())

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

Версия на основе метода pack в этом примере использует фреймы- ряды и метки фиксированной длины (напомню еще раз, что схема с фреймами-колонками не позволяет добиться требуемой точности). Эти две функции создают виджеты меток и полей ввода одинаковым способом, но размещаются они совершенно разными путями:

     При использовании метода pack метки и поля ввода прикрепляются к левому и правому краям с помощью параметров side, и для каждого ряда создается виджет Frame (который прикрепляется к верхнему краю родителя).

     При использовании метода grid каждому виджету назначается положение с помощью параметров row (ряд) и column (колонка) в предполагаемой табличной сетке родителя.

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

При внимательном рассмотрении можно заметить, что разница в объеме программного кода, необходимого для каждой схемы, ничтожна, по крайней мере для случая простой формы. Схема на основе метода pack должна создать отдельный виджет Frame для каждого ряда, а схема на основе метода grid должна отслеживать номер текущего ряда.

Фактически обе схемы требуют для реализации одинаковое количество строк программного кода. Однако справедливости ради следует заметить, что реализации обеих схем можно было бы сократить на одну строку, если добавлять метку немедленно, а реализацию на основе метода grid можно было бы сократить еще на две строки, применив встроенную функцию enumerate, чтобы избавиться от необходимости вести счет рядов вручную. Ниже приводится уменьшенная версия функции gridbox:

def gridbox(parent):

for (row, color) in enumerate(colors):

Label(parent,text=color,relief=RIDGE,width=25).grid(row=row,column=0) ent = Entry(parent, bg=color, relief=SUNKEN, width=50) ent.grid(row=row, column=1) ent.insert(0, ‘grid’)

Оставим дальнейшее уменьшение размеров реализации для тех, кому не чужд спортивный интерес (мы приводим не самую шокирующую реализацию, однако ваше стремление к краткости программного кода совсем не обязательно покажется достижением вашим коллегам!). Независимо от схемы компоновки сложность обеих реализаций выглядит примерно одинаковой. Однако, как будет показано далее, для реализации компоновки по сетке может потребоваться больше программного кода, когда появляется необходимость изменять размеры виджетов вместе с окном.

Рис. 9.30. Эквивалентные окна для схем размещения на основе grid и pack

 

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

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