Vzorový program bez Glade

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

Použití Glade a gtk.Builder()

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


Vytvoření okna v Glade

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.

Přidání smysluplné obsluhy událostí: řešení kvadratické rovnice

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

Zpět na obsah | Poslední úprava: 2011-11-27