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

Python 1. Dynamické implementace grafických uživatelských funkcí na widgety knihovny Tix: ScrolledWindow a NoteBook

Do hlavní O symbolu

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.

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

Do hlavní O symbolu