ru en pl cs sk bg de fr es it ro hu tr ar id ja zh

Python 1. Особливості реалізації динамічного GUI на віджетах бібліотеки Tix: ScrolledWindow і NoteBook

На головну Про символ

Одним з переваг динамічної мови програмування 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.

На головну Про символ