Následující program využívá to, co jsme se už učili. Hlavička, kódování (!), import, definice hlavní třídy.
Změna, kterou jsem si v dobré víře dovolil učinit, je v obsluze chyb. Podívejte se na kód. Místo uzavření výkonu programu do try..except nyní přesměrujeme systémovou funkci výpisu chyb na vlastní, vylepšenou tak, aby se nezavřelo okno po výpisu chyby.
Pak následuje: inicializace hlavní třídy a čekání na uživatelskou odezvu pomocí gtk.main().
#!/usr/bin/env python #coding=utf8 ## důležité: určuje kódování souboru; nutno zvolit cp1250 nebo utf8 dle editoru import sys, gtk class Main: def __init__(self): ## Vytvoření widgetů dle potřeby self.window1 = gtk.Window() self.hbox1 = gtk.HBox() self.window1.add(self.hbox1) self.btnText = gtk.Button("OK") self.hbox1.pack_start(self.btnText) self.ent1 = gtk.Entry() self.hbox1.pack_start(self.ent1) self.btnKonec = gtk.Button("Konec") self.hbox1.pack_start(self.btnKonec) self.window1.show_all() ## Přidání obsluhy událostí dle potřeby self.window1.connect('destroy', lambda w: gtk.main_quit()) # zavření okna -> ukončení programu self.btnText.connect("clicked", self.on_btnText_clicked) self.btnKonec.connect("clicked", self.destroy) ## Odsud obsluhy událostí def destroy(self, widget, data=None): gtk.main_quit() # korektní ukončení programu def on_btnText_clicked(self, sender): print "Clicked" self.ent1.set_text(u"Vložený text") def myerr(exc_type, exc_value, tb): import traceback; traceback.print_exception(exc_type, exc_value, tb) raw_input() # smažte pro výpis chyby bez pozastavení; přejmenujte na input() v pythonu3 sys.excepthook = myerr # úprava výpisu chyb, aby se program pozastavil po výpisu MainInstance = Main() # inicializace hlavní třídy programu gtk.main() # program čeká na události, které vyvolá uživatel
Cílem dnešní hodiny je ale program používající gtk.Builder(), který nahrazuje ruční inicializaci widgetů. Podívejte se níže:
V adresáři u tohoto programu musí být připraven soubor gui.xml, který obsahuje soupis widgetů nakreslených v programu Glade (někdy též pod jménem glade-gtk2).
Těchto 30 řádků kódu se stane základem pro naše budoucí programy.
#!/usr/bin/env python #coding=utf8 ## důležité: určuje kódování souboru; nutno zvolit cp1250 nebo utf8 dle editoru import sys, gtk class Main: def __init__(self): ## Vytvoření widgetů a přidání obsluh událostí podle Glade self.builder = gtk.Builder() self.builder.add_from_file(sys.path[0] + "/" + "gui.xml") self.builder.connect_signals(self) self.w("window1").show_all() def w(self, widgetname): """Pomůcka pro stručný přístup k widgetům""" return self.builder.get_object(widgetname) ## Odsud obsluhy událostí def myerr(exc_type, exc_value, tb): import traceback; traceback.print_exception(exc_type, exc_value, tb) raw_input() # smažte pro výpis chyby bez pozastavení; přejmenujte na input() v pythonu3 sys.excepthook = myerr # úprava výpisu chyb, aby se program pozastavil po výpisu MainInstance = Main() # inicializace hlavní třídy programu gtk.main() # program čeká na události, které vyvolá uživatel
1. Spusťte Glade, klikněte na ikonku "Window" a vyrobte tím prázdné okno.
2. Vložte do něj gtk.Grid s 2x5 poli.
3. Do polí grid1 natahejte gtk.Label, gtk.Entry, gtk.Button.
4. Změňte vlastnosti widgetů. Označte ve stromovém seznamu widgetů (vpravo nahoře) window1, přejděte do nastavení jeho vlastností a změňte vlastnost Titulek okna.
U label1,2,3 změňte vlastnost Popis dle obrázku, u button1 změňte Popis na "Zavřít".
5. U label4 zapněte volbu Používat značky, napište tam
x<sub>1,2</sub> =a podívejte se, jak se dají využít na vyrobení formátovaného textu (více zde).
6. Označte objekt button1, přejděte na kartu Signály a přidejte obsluhu události clicked jako on_button1_clicked
. (Doporučuji tento text rovnou zkopírovat do nějakého souboru.)
Podobně označte postupně entry1, 2 a 3 a na kartě Signály rozklikněte "GtkEditable" a pro každý z těch 3 widgetů přidejte obsluhu události change on_entry123_changed
.
Nakonec soubor uložte jako gui.xmlve formátu GtkBuilder do složky, kde máte svůj program.
Pozn. vhodnou kostru grafického programu máte připravenou zde.
#!/usr/bin/env python #coding=utf8 ## důležité: určuje kódování souboru; nutno zvolit cp1250 nebo utf8 dle editoru import sys, gtk class Main: def __init__(self): ## Vytvoření widgetů a přidání obsluh událostí podle Glade self.builder = gtk.Builder() self.builder.add_from_file(sys.path[0] + "/" + "gui.xml") self.builder.connect_signals(self) self.w("window1").connect('destroy', lambda w: gtk.main_quit()) # zavření okna -> ukončení programu self.w("window1").show_all() def w(self, widgetname): """Pomůcka pro stručný přístup k widgetům""" return self.builder.get_object(widgetname) ## Odsud obsluhy událostí def on_button1_clicked(self, widget): """Ukončí program""" gtk.main_quit() def on_entry123_changed(self, widget): """Počítá kořen kvadratické rovnice""" a = float(self.w("entry1").get_text()) b = float(self.w("entry2").get_text()) c = float(self.w("entry3").get_text()) D = b*b - 4*a*c if D >= 0: self.w("entry4").set_text("TODO") else: self.w("entry4").set_text("rovnice nemá kořen") def myerr(exc_type, exc_value, tb): import traceback; traceback.print_exception(exc_type, exc_value, tb) raw_input() # smažte pro výpis chyby bez pozastavení; přejmenujte na input() v pythonu3 sys.excepthook = myerr # úprava výpisu chyb, aby se program pozastavil po výpisu MainInstance = Main() # inicializace hlavní třídy programu gtk.main() # program čeká na události, které vyvolá uživatel