Варианты компоновки: по сетке

varianty komponovki po setke Экскурсия по tkinter, часть 1

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

Приложив совсем немного усилий, мы можем добиться более стройного размещения миниатюр, либо разместив их по сетке, либо использовав кнопки фиксированного размера. Сценарий в примере 8.47 располагает кнопки по сетке, используя менеджер компоновки grid — более подробно мы будем рассматривать его в следующей главе. Как и представление холстов выше, некоторые фрагменты этого примера следует рассматривать, как предварительное знакомство. В двух словах, функция grid располагает содержимое по рядам и колонкам — все приемы, обеспечивающие неподвижность кнопки Quit, будут рассматриваться в главе 9.

Пример 8.47. PP4E\Gui\PIL\viewer-thumbs-grid.py

то же, что и viewer_thumbs, но использует менеджер компоновки grid, чтобы добиться более стройного размещения миниатюр; того же эффекта можно добиться с применением фреймов и менеджера pack, если кнопки будут иметь фиксированный и одинаковый размер;

import sys, math from tkinter import * from PIL.ImageTk import PhotoImage

from viewer_thumbs import makeThumbs, ViewOne

def viewer(imgdir, kind=Toplevel, cols=None):

измененная версия, размещает миниатюры по сетке

win = kind()

win.title(‘Viewer: ‘ + imgdir) thumbs = makeThumbs(imgdir) if not cols:

cols = int(math.ceil(math.sqrt(len(thumbs))))# фиксированное или N x N

rownum = 0 savephotos = [] while thumbs: thumbsrow, thumbs = thumbs[:cols], thumbs[cols:] colnum = 0

for (imgfile, imgobj) in thumbsrow:

photo = PhotoImage(imgobj) link = Button(win, image=photo) handler = lambda savefile=imgfile: ViewOne(imgdir, savefile) link.config(command=handler)

link.grid(row=rownum, column=colnum) savephotos.append(photo) colnum += 1

rownum += 1

Button(win, text=’Quit’, command=win.quit).grid(columnspan=cols, stick=EW) return win, savephotos

if __name__ == ‘__main__’:

imgdir = (len(sys.argv) > 1 and sys.argv[1]) or ‘images’ main, save = viewer(imgdir, kind=Tk) main.mainloop()

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

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

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