Kategória: Python

Zmenené: 13. máj 2012

Boxový kontajner v GTK3

Konečne som sa rozhodol začať robiť pokusy v GTK3, a ako prvý prišiel na rad kontajner GtkBox, ktorý je vlastne základným prvkom na tvorbu rozmiestnenia prvkov grafického rozhrania. V tomto návode sa zameriam na možnosti nastavovania veľkosti prvkov vnorených v tomto kontajneri.

Trocha teórie

Trocha teórie na začiatok nikdy neuškodí, aspoň môže každý pochopiť o čom je reč. Prvok GtkBox sa používa na automatické umiestňovanie vnorených prvkov do riadkov, respektíve stĺpcov, a je teda kontajnerom, ktorý môže obsahovať ďalšie prvky grafického rozhrania. V staršej verzii GTK sa používali dve verzie tohoto prvku, a to GtkVBox a GtkHBox, ktoré sú síce stále k dispozícii, ale boli označené ako zastarané a nemali by ste ich používať.

Nastavenie orientácie

V predchádzajúcom odstavci som spomenul dve dôležité veci, pričom prvou je rozmiestňovanie vnorených prvkov v riadkoch a stĺpcoch. Ktorý spôsob rozmiestňovania bude použitý možno určiť pri vytváraní inštancie pomocou parametra orientation, ktorý môže nadobúdať dve hodnoty:

  • vertikálny Gtk.Orientation.VERTICAL
  • horizontálny Gtk.Orientation.HORIZONTAL

Napríklad:

vbox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
hbox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)

Nastavenie rozmiestnenia

Prvok GtkBox má vlastnosť, pomocou ktorej môžete určiť, akým spôsobom bude priestor rozdelený medzi vnorené prvky (homogeneous) a aká veľká bude medzera medzi jednotlivými vnorenými prvkami (spacing).

Vlastnosť homogeneous je vlastne logická hodnota, ktorá udáva, či bude dostupné miesto rozdelené medzi vnorené prvky rovnomerne (True) alebo nie (False). Predvolená hodnota je True, takže ak túto vlastnosť po vytvorení prvku nenastavíte na False, budú niektoré nižšie uvedené pokusy neúspešné. Rovnomerné rozdelenie dostupného miesta znamená, že všetky vnorené prvky budú mať presne rovnakú veľkosť.

K vlastnosti homogeneous možno pristupovať pomocou metód set_homogeneous() resp. get_homogeneous().

Príklad

Uvedený príklad by mal pomôcť pochopiť rozdiel medzi kontajnermi, ktoré majú nastavené rôznu hodnotu vlastnosti homogeneous .

from gi.repository import Gtk

# Ukážkové okno
window = Gtk.Window()
window.set_title('Príklad homogeneous')
window.connect('destroy', Gtk.main_quit)
window.set_size_request(400, 300)

# Box s homogenous = False
nohomogBox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
nohomogBox.set_homogeneous(False)

lblExpand = Gtk.Label('Rozšírený')
lblNoExpand = Gtk.Label('Nerozšírený')

# Dva prvky GtkLabel s oddeľovačom
nohomogBox.pack_start(lblExpand, True, True, 0)
nohomogBox.pack_start(Gtk.VSeparator(), False, False, 3)
nohomogBox.pack_start(lblNoExpand, False, True, 0)

# Box s homogeneous = True
homogBox = Gtk.Box(orientation = Gtk.Orientation.HORIZONTAL)
homogBox.set_homogeneous(True)

lblExpand = Gtk.Label('Rozšírený')
lblNoExpand = Gtk.Label('Nerozšírený')

# Dva prvky GtkLabel s oddeľovačom
homogBox.pack_start(lblExpand, True, True, 0)
homogBox.pack_start(Gtk.VSeparator(), False, False, 3)
homogBox.pack_start(lblNoExpand, False, True, 0)

# Vertikálny GtkBox
vbox = Gtk.Box(orientation = Gtk.Orientation.VERTICAL)
vbox.set_homogeneous(True)

# Pridať nehomogényn Box
vbox.pack_start(nohomogBox, True, True, 3)
# Pridať homogényn Box
vbox.pack_start(homogBox, False, True, 3)

# Pridať vertikálny box do okna
window.add(vbox)
window.show_all()
Gtk.main()
Vlastnosť homogeneous

Vlastnosť homogeneous

Uvedený príklad ukazuje vytvorenie dvoch horizontálnych prvkov GtkBox, ktoré sú v podstate rovnaké a líšia sa len nastavením vlastnosti homogeneous. Výsledné okno je zobrazené na obrázku a môžete na ňom vidieť, že obsahuje štyri prvky GtkLabel, organizované do dvoch riadkov. Prvý i druhý riadok sú vlastne kontajnery GtkBox, pričom prvý má nastavené nehomogénne rozmiestňovanie, a tak má každý prvok inú šírku. Kontajner GtkBox v druhom riadku má nastavené homogénne rozmiestňovanie a na obrázku vidno, že každý prvok druhého riadku má rovnakú šírku, vrátane oddeľovača.

Nastavenie vlastnosti homogeneous má vplyv vždy len na jeden rozmer prvkov, pri horizontálnom GtkBox ovplyvňuje šírku prvkov, a pri vertikálnom zase výšku prvkov.

Pridávanie prvkov

Vnorené prvky možno do kontajnera GtkBox vkladať dvoma spôsobmi, a to od začiatku alebo od konca. V oboch prípadoch budú prvky zobrazované v poradí, v akom boli pridané, líši sa len smer ktorým budú pridávané. Pri pridávaní od začiatku bude prvý pridaný prvok celkom vľavo (hore) a posledný celkom vpravo (dole). Na samotné pridanie prvku do kontajnera slúžia metódy:

  • gtk_box_pack_start()
  • gtk_box_pack_end()

Obe tieto metódy majú rovnaké parametre a je potrebné im zadať, okrem samotného prvku, aj nastavenie parametrov expand, fill a padding, ktoré nastavujú rovnomenné vlastnosti vnoreného prvku. Vlastnosti expand a fill sú logické hodnoty, ktoré znova udávajú ako bude obsluhovaná veľkosť vnoreného prvku. Na rozdiel od vlastnosti homogeneous už však ovládajú len tento konkrétny prvok (hoci nastavenie môže mať vplyv aj na veľkosť ostatných vnorených prvkov).

Rozšírenie

Vlastnosť expand udáva, koľko miesta má byť vyhradené pre daný prvok. Ak je táto vlastnosť vnoreného prvku nastavená na False, pre prvok je vyhradené práve toľko miesta, koľko nevyhnutne potrebuje. Ak je táto vlastnosť nastavená na True, bude všetko dostupné miesto (po odrátaní miesta na prvky s expand = False) rovnomerne rozdelené medzi všetky vnorené prvky s expand = True.

Vlastnosť expand priamo neovláda veľkosť vnorených prvkov, ale medzeru medzi prvkami v príslušnom smere, ktorý závisí na orientácii kontajnera.

Vyplnenie

Druhá vlastnosť je fill a udáva, či má byť veľkosť prvku zmenená tak, aby vyplnil všetko dostupné miesto (True), alebo má byť okolo prvku ponechané voľné miesto (False). Hodnota vlastnosti fill nemá žiadny vplyv, ak je vlastnosť expand nastavená na False.

Vlastnosť fill priamo ovláda veľkosť vnoreného prvku, pričom konkrétna veľkosť závisí od dostupného miesta (počtu prvkov) a aj od nastavenia vlastnosti expand.

Príklad

V nasledujúcom príklade sa pokúsim ukázať ako sa líšia rozmery prvkov v závislosti od nastavenia vlastností expand a fill.

from gi.repository import Gtk

# Add both of the example boxes to the window
window = Gtk.Window()
window.set_title('Príklad rozširovania a vyplňovania')
window.connect('destroy', Gtk.main_quit)
window.set_size_request(400, 300)

# Príklad 1: Parameter "expand"

boxExpand = Gtk.VBox(Gtk.Orientation.VERTICAL)
boxExpand.set_homogeneous(False)

btnExpand = Gtk.Button('Rozšírený')
btnNoExpand = Gtk.Button('Nerozšírený')

# Pridá tlačidlo expand = True
boxExpand.pack_start(btnExpand, True, False, 0)

# Pridá oddeľovač, kvôli orientácii v rozmeroch
boxExpand.pack_start(Gtk.Separator(), False, False, 3)

# Pridá tlačidlo expand = False
boxExpand.pack_start(btnNoExpand, False, False, 0)

# Príklad 2: Parameter "fill"

boxFill = Gtk.VBox(Gtk.Orientation.VERTICAL)
boxFill.set_homogeneous(False)

btnFill = Gtk.Button('Vyplnený')
btnNoFill = Gtk.Button('Nevyplnený')

# Pridá tlačidlo s fill = True
boxFill.pack_start(btnFill, True, True, 0)

# Pridá oddeľovač, kvôli orientácii v rozmeroch
boxFill.pack_start(Gtk.Separator(), False, False, 3)

# Pridá tlačidlo s fill = False
boxFill.pack_start(btnNoFill, True, False, 0)

# Homogénny horizontálny kontajner, aby oba príklady mali rovnaké miesto
hbox = Gtk.HBox(Gtk.Orientation.HORIZONTAL)
hbox.set_homogeneous(True)

# Pridá kontajnery príkladmi
hbox.pack_start(boxExpand, True, True, 3)
hbox.pack_start(boxFill, True, True, 3)

# Pridá hlavný kontajner do okna
window.add(hbox)
window.show_all()
Gtk.main()

V príklade demonštrujem vplyv vlastností expand a fill na vnorené prvky. Na obrázku, ktorý je výstupom programu môžete vidieť štyri tlačidlá, ktoré sú organizované v dvoch rovnako širokých stĺpcoch.

Vlastnosti expand a fill

Vlastnosti expand a fill

V ľavom stĺpci majú tlačidlá zhodne nastavenú vlastnosť fill na False. Horné tlačidlo má expand nastavené na True a keďže je to jediný prvok s týmto nastavením, je pre neho vyhradené vštetko dostupné miesto, ktoré zvýši po druhom tlačidle, ktoré má vlastnosť expand nastavenú na False. Koľko miesta má ktorý prvok k dispozícii možno dobre vidieť vďaka oddeľovaču (čiare), ktorá je medzi obomi tlačidlami.

V pravom stĺpci sú opäť dve tlačidlá, ale tentokrát majú obe nastavenú vlastnosť expand na True, a tak je dostupné miesto rovnomerne rozdelené medzi oba prvky, a tým krásne vystúpi rozdiel medzi nastavením vlastnosti fill. Prvé tlačidlo má fill nastavené na True, preto vypĺňa celý priestor, ktorý je pre neho vyčlenený. Druhé (dolné) tlačidlo má túto vlastnosť nastavenú na False, a tak jeho veľkosť nie je zmenená a ostáva okolo neho voľné miesto.

Záver

Nesnažil som sa tu vyčerpávajúco popísať vlastnosti a metódy kontajnera GtkBox a ak potrebujete podrobnejšie informácie, s dôverou sa obráťte na odkazy, ktoré tu mám. Postupom času sa môžu zmeniť, ale momentálne odkazujú na dokumentáciu Gtk 3.2. Ak vás prekvapí, že dokumentácia nepopisuje priamo syntax Pythonu, tak sa s tým zmierte, pretože nový spôsob integrácie Gtk v Pythone už nepoužíva vlastnú implementáciu, ale používa priamo rozhranie Gtk. Navštívte The Python GTK+ 3 Tutorial, ktorý sa zaoberá priamo Gtk3 v Pythone.