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

Python 1. Dynamické implementačné funkcie GUI na miniaplikátoch knižnice Tix: ScrolledWindow a NoteBook

Do hlavného O symbole

Jednou z výhod dynamického programovacieho jazyka Python je schopnosť dynamicky vytvárať grafické užívateľské rozhranie (GUI) za behu. Vstavaná knižnica Tkinter umožňuje vytvárať, umiestňovať a presúvať rôzne grafické prvky pre ovládanie, vstupné a výstupné informácie - widgety. Knižnica Tkinter má však jednu funkciu, ak je počet miniaplikácií väčší než umožňuje zobrazenie okna s maximálnymi veľkosťami dostupnými pre obrazovku monitora, potom je problém s prístupom k skrytej oblasti okna.

Rozšírenie zabudovanej knižnice Tkinter, knižnice Tix (Tk Interface Extension), vyrieši tento problém pomocou miniaplikácie ScrolledWindow - okna s posuvnými lištami. Druhou užitočnou miniaplikáciou, ktorá je dodávaná s knižnicou Tix, je okienko s kartami - NoteBook.

Používanie týchto miniaplikácií v aplikáciách s oknami v Pythone má však vlastné zvláštnosti zobrazovania informácií v prípade, že interné miniaplikácie nezodpovedajú priradenej veľkosti okna. V tomto článku sa pozrieme na tieto funkcie pri organizovaní dynamického GUI:
Prvým príkladom je umiestnenie miniaplikácie ScrolledWindow do hlavného okna aplikácie a všetky ostatné miniaplikácie sa automaticky umiestnia do nej.
Druhým príkladom je umiestniť miniaplikácie ScrolledWindow len na karte miniaplikácie NoteBook.

Tu uvedené príklady sú implementované v Pythone 2.7 a operačnom systéme Linux: Ubuntu 16.04LTS. Dúfam, že implementácia týchto príkladov vo vašej verzii Pythonu a operačného systému nepredstavuje pre vás žiadnu zložitosť.


Príklad No.1 - ScrolledWindow widget ako hlavný kontajner celej aplikácie.

#!/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()

Výsledok scenára No.1 možno vidieť na nasledujúcich troch obrázkoch:


Figúra 1

Počiatočný pohľad na aplikáciu N1o.1 po spustení. Zobrazí sa automatický výskyt posúvacích pruhov vpravo av spodnej časti hlavného okna. Keďže celková veľkosť obsadená miniaplikáciou Notebook je väčšia ako pôvodné koreňové okno (800x600), pretože počet kariet určených v prvom cykle a počet štítkov určených v nasledujúcich dvoch cykloch je väčší. Tento obrázok ukazuje, že zo zadaných 20 záložiek bolo v hlavnom okne umiestnených iba 15 a z nich bolo umiestnených len 31 z 39 značiek uvedených na prvej záložke.


Figúra 2

Druhá karta v počiatočnom stave zobrazuje len 16 etikiet z 28. Poloha posuvných tyčí zostáva nezmenená.


Figúra 3

Pri posúvaní spodného posúvača doprava môžete vidieť, že hlavné okno pokrýva nielen všetky karty miniaplikácie NoteBook, ale aj všetky značky umiestnené na druhej záložke.


Príklad No.2 - Widget ScrolledWindow sa nachádza vo vnútri každej záložky miniaplikácie 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()

Výsledok scenára No.2 možno vidieť na nasledujúcich troch obrázkoch:


Figúra 4

Pôvodný pohľad na aplikáciu No.2 po spustení. Posuvník sa objavil iba vpravo na karte Tab1, pretože počet vertikálnych značiek je väčší ako pôvodné veľkosti hlavného okna.


Figúra 5

Druhá karta zobrazuje iba spodnú posuvnú lištu, pretože na tejto karte sú štítky umiestnené horizontálne.


Figúra 6

Posunutím posúvacej lišty napravo môžete vidieť všetky štítky na konci okna, ale nemôžete pristupovať na karty s číslami väčšími ako 15. Preto vo variante No.2 poskytujú posúvače prístup len v rámci záložky. Ak je počet kariet väčší ako ten, ktorý je umiestnený v horizontálnej veľkosti hlavného okna, nebude k nim prístup.

Preto ak je počet kariet miniaplikácie NoteBook príliš veľký na prekročenie hraníc zobrazenia hlavného okna, považuje sa za prijateľný variant umiestnenia miniaplikácie ScrolledWindow.

Pokus o zjednotenie oboch variantov priniesol rovnaký výsledok ako príklad No.1, pretože okno widgetu ScrolledWindow sa rozširuje na maximálne veľkosti obsadené objektmi, ktoré sú v ňom umiestnené.

Dúfam, že tieto príklady vám pomôžu pri navrhovaní vašich okenných aplikácií v Pythone.

Oleksii Tolkachov (ORCID ID: 0000-0002-4835-0507), Kiev, 30.08.2017.

Do hlavného O symbole