Одним из преимуществ динамического языка программирования Python является возможность динамического создания графического интерфейса пользователя (GUI) во время выполнения программы.
Встроенная библиотека Tkinter позволяет создавать, размещать и перемещать разнообразные графические элементы управления, ввода и вывода информации - виджеты.
Однако, библиотека Tkinter имеет одну особенность, если количество виджетов становится больше чем позволяет отобразить окно с максимальными размерами доступными для Вашего экрана монитора, то возникает проблема доступа к скрытой области окна.
Расширение встроеной библиотеки Tkinter, библиотека Tix (Tk Interface Extension) позволяет решить эту проблему с помощью виджета ScrolledWindow - окно с полосами прокрутки.
Второй полезный виджет, поставляемый с библиотекой Tix, это окно с вкладками - NoteBook.
Однако, использование этих виджетов в оконных приложениях на языке Python имеет свои особенности отображения информации в том случае, когда внутренние виджеты не умещаются в отведённый размер окна.
В этой статье, мы рассмотрим эти особенности при организации динамического GUI:
Первый пример - разместим виджет ScrolledWindow в главном окне приложения, и таким образом, все остальные виджеты будут автоматически размещены в нём.
Второй пример - разместим виджеты ScrolledWindow только во вкладках виджета NoteBook.
Представленные здесь примеры реализованны в Python 2.7 и операционной системе Linux: Ubuntu 16.04LTS.
Надеюсь, что реализовать эти примеры в Вашей версии языка Python и операционной системе не будет представлять для Вас какой-либо сложности.
Пример №1 - виджет ScrolledWindow как главный контейнер всего приложения.
#!/usr/bin/python
import Tix as tx
root=tx.Tk()
root.geometry("800x600+0+10")
swr=tx.ScrolledWindow(root)
swr.pack(fill=tx.BOTH, expand=1)
nb=tx.NoteBook(swr.window)
nb.pack(fill=tx.BOTH, expand=1)
for i in range(1,21):
nb.add("tab"+str(i),label="Tab "+str(i))
for k in range(1,39):
l=tx.Label(nb.tab1,text="label "+str(k))
l.pack()
for k in range(1,29):
l=tx.Label(nb.tab2,text="label "+str(k))
l.pack(side=tx.LEFT)
root.mainloop()
Результат выполения сценария №1 можно видеть на следующих трёх рисунках:
Рисунок 1
Исходный вид приложения №1 после запуска.
Видно автоматическое появление полос прокрутки с права и в низу главного окна.
Так как общий размер занимаемый виджетом NoteBook превышает изначально заданый для окна root (800x600) из-за количества вкладок (Tab), заданных в первом цикле, и количества меток (Label), заданных в последующих двух циклах.
На этом рисунке видно, что из заданных 20 вкладок в главное окно поместилось только 15, а из 39 меток, заданных в первой вкладке, только 31.
Рисунок 2
Вторая вкладка в исходном состоянии показывает только 16 меток из 28.
Положение полос прокрутки остаётся неизменным.
Рисунок 3
Переместив нижнию полосу прокрутки в право можно видеть, что главное окно охватывает не только все вкладки виджета NoteBook но и все метки размещённые во второй вкладке.
Пример №2 - виджет ScrolledWindow расположен внутри каждой вкладки виджета NoteBook.
#!/usr/bin/python
import Tix as tx
root=tx.Tk()
root.geometry("800x600+0+10")
swm = []
nb=tx.NoteBook(root)
nb.pack(fill=tx.BOTH, expand=1)
for i in range(1,21):
nb.add("tab"+str(i),label="Tab "+str(i))
sw=tx.ScrolledWindow(eval("nb.tab"+str(i)))
swm.append(sw)
sw.pack(fill=tx.BOTH, expand=1)
for k in range(1,39):
l=tx.Label(swm[0].window,text="label "+str(k))
l.pack()
for k in range(1,29):
l=tx.Label(swm[1].window,text="label "+str(k))
l.pack(side=tx.LEFT)
root.mainloop()
Результат выполения сценария №2 можно видеть на следующих трёх рисунках:
Рисунок 4
Исходный вид приложения №2 после запуска.
Полоса прокрутки появилась только справа, во вкладке Tab1, так как количество вертикальных меток больше чем исходные размеры главного окна.
Рисунок 5
Вторая вкладка показывает только нижнию полосу прокрутки, так как в этой вкладке метки расположенны горизонтально.
Рисунок 6
Переместив полосу прокрутки вправо, можно увидеть все метки до конца окна, но нельзя получить доступ до вкладок с номерами больше 15.
Таким образом, в варианте №2, полосы прокрутки обеспечивают доступ только внутри вкладки.
Если количество вкладок больше чем помещается в горизонтальный размер главного окна, то к ним не будет доступа.
Поэтому, если количество вкладок виджета NoteBook не слишком велико, что бы выйти за допустимые пределы отображения главного окна, то рассмотренный вариант расположения виджета ScrolledWindow вполне допустим.
Попытка объеденения обеих вариантов дала такойже результат как и у примера №1, потому что окно виджета ScrolledWindow расширяется по максимальным размерам занимаемым размещёнными в нём объектами.
Надеюсь, что приведённые примеры помогут Вам в проектировании Ваших оконных приложений на языке Python.
Алексей Толкачёв (ORCID ID: 0000-0002-4835-0507), Киев, 30.08.2017.