Компоновка по сетке улучшает картину, — картинки располагаются ровными рядами и колонками — но сама форма картинок оставляет желать лучшего. Мы могли бы добиться еще более стройного размещения, использовав кнопки фиксированного размера. По умолчанию размеры кнопок автоматически подстраиваются под размер изображения (или текста), но мы всегда можем зафиксировать размер кнопок. Эта уловка используется в примере 8.48. Данный сценарий устанавливает высоту и ширину каждой кнопки в соответствии с максимальным размером миниатюр, чтобы ни одна кнопка не оказалась ни слишком узкой, ни слишком низкой. Если для всех миниатюр будет установлен один и тот же максимальный размер (что гарантируется нашей функцией создания миниатюр), это обеспечит желаемое размещение кнопок.
Рис. 8.47. Графический интерфейс выбора миниатюр с размещением по сетке
Пример 8.48. PP4E\Gui\PIL\viewer-thumbs-fixed.py
использует кнопки фиксированного размера для миниатюр, благодаря чему достигается еще более стройное размещение; размеры определяются по объектам изображений, при этом предполагается, что для всех миниатюр был установлен один и тот же максимальный размер; по сути именно это и делают графические интерфейсы файловых менеджеров;
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
savephotos = [] while thumbs: thumbsrow, thumbs = thumbs[:cols], thumbs[cols:] row = Frame(win) row.pack(fill=BOTH) for (imgfile, imgobj) in thumbsrow:
size = max(imgobj.size) # ширина, высота
photo = PhotoImage(imgobj)
link = Button(row, image=photo)
handler = lambda savefile=imgfile: ViewOne(imgdir, savefile) link.config(command=handler, width=size, height=size) link.pack(side=LEFT, expand=YES) savephotos.append(photo)
Button(win, text=’Quit’, command=win.quit, bg=’beige’).pack(fill=X) 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.48 — теперь все кнопки имеют одинаковые размеры, вычисленные на основании размеров имеющихся изображений. Все миниатюры отображаются как одинаковые элементы мозаики независимо от их формы, что упрощает и просмотр. Естественно, возможны и другие схемы размещения — поэкспериментируйте с некоторыми параметрами настройки в этом сценарии, чтобы посмотреть их воздействие на графический интерфейс.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, I том, 2011