Jednou z výhod dynamického programovacího jazyka Python je schopnost dynamicky vytvářet grafické uživatelské rozhraní (GUI) za běhu.
Vestavěná knihovna Tkinter umožňuje vytvářet, umisťovat a přesouvat různé grafické prvky pro ovládání, vstupní a výstupní informace - widgety.
Knihovna Tkinter však má jednu funkci, pokud je počet widgetů větší, než umožňuje zobrazit okno s maximálními velikostmi dostupnými pro obrazovku monitoru, pak je problém s přístupem k skryté oblasti okna.
Rozšíření vestavěné knihovny Tkinter, knihovna Tix (Tk Interface Extension), vyřeší tento problém pomocí widgetu ScrolledWindow - okna s posuvníky.
Druhým užitečným widgetem, který je dodáván s knihovnou Tix je okenní tabulátko - NoteBook.
Použití těchto widgetů v okenních aplikacích v Pythonu má však své vlastní zvláštnosti při zobrazování informací v případě, že interní widgety neodpovídají přiřazené velikosti okna.
V tomto článku se podíváme na tyto funkce při organizaci dynamického GUI:
První příklad je umístit widget ScrolledWindow do hlavního okna aplikace a všechny ostatní widgety se tak automaticky umístí.
Druhým příkladem je umístit widgety ScrolledWindow pouze na kartách widgetu NoteBook.
Zde uvedené příklady jsou implementovány v Pythonu 2.7 a v operačním systému Linux: Ubuntu 16.04LTS.
Doufám, že implementace těchto příkladů ve vaší verzi Pythonu a operačního systému nebude pro vás znamenat žádnou složitost.
Příklad No.1 - ScrolledWindow widget jako hlavní kontejner celé aplikace.
#!/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ýsledkem scénáře No.1 lze vidět na následujících třech číslech:
Postava 1
Počáteční pohled na aplikaci No.1 po spuštění.
Zobrazuje se automatický výskyt posuvníků z pravé a spodní části hlavního okna.
Protože celková velikost obsazená widgetem NoteBook je větší než původní kořenové okno (800x600) vzhledem k počtu karet specifikovaných v prvním cyklu a počtu štítků určených v následujících dvou cyklech.
Tento obrázek ukazuje, že ze zadaných 20 karet bylo umístěno pouze 15 v hlavním okně a pouze 31 z 39 štítků uvedených v první záložce.
Postava 2
Druhá záložka v počátečním stavu zobrazuje pouze 16 jmenovek z 28.
Poloha posuvníků zůstává nezměněna.
Postava 3
Posunutím dolního rolovacího panelu doprava můžete vidět, že hlavní okno pokrývá nejen všechny karty widgetu NoteBook, ale také všechny značky umístěné na druhé kartě.
Příklad No.2 - Widget ScrolledWindow se nachází uvnitř každé karty widgetu 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ýsledkem scénáře No.2 lze vidět na následujících třech číslech:
Postava 4
Počáteční pohled na aplikaci No.2 po spuštění.
Posuvník se objevil pouze vpravo na kartě Tab1, protože počet svislých značek je větší než původní velikosti hlavního okna.
Postava 5
Druhá záložka zobrazuje pouze spodní posuvník, protože na této záložce jsou štítky umístěny vodorovně.
Postava 6
Posunutím posuvníku doprava můžete vidět všechny štítky na konci okna, ale nemáte přístup k kartám s čísly větším než 15.
Proto ve variantě No.2 poskytují posuvníky přístup pouze v záložce.
Pokud je počet karet větší než je velikost horizontálního okna, nebude k nim přístup.
Pokud tedy počet záložek widgetu NoteBook není příliš velký, aby překročil limity zobrazení v hlavním okně, pak je přijatelná varianta umístění widgetu ScrolledWindow považována za přijatelnou.
Pokus o sjednocení obou variant přinesl stejný výsledek jako příklad No.1, protože okno widgetu ScrolledWindow se rozšiřuje na maximální velikosti obsazené objekty, které jsou v něm umístěny.
Doufám, že vám tyto příklady pomohou při navrhování aplikací v systému Python.