Seminář programování v Pythonu na PORGu - lekce 21


Práce s obrázky

Minimání načtení obrázku

1) S použitím šablony grafické aplikace a programu Glade vytvořte známým postupem okno.

2) Do okna vložte widget třídy gtkDrawingArea. Objektu drawingarea1 nastavte obsluhu události button-press-event na funkci on_drawingarea1_button_press_event. (Pokud chcete, aby se oknem dalo posouvat jako v prohlížeči obrázků, tak do okna vložte gtkScrolledWindow, do něj gtkViewport a až do něj gtkDrawingArea, jak je to na obrázku níže.)

3) To ale nestačí; aby vůbec tuto událost vyvolával, musí se mu nastavit vlastnost "Události" a v ní povolit událost "Stisknutí tlačítka", viz obrázky:

4) Do funkce __init__ hlavní třídy programu hoďte tento řádek, symbolizující, že dosud nebyl načten žádný obrázek.

        self.pixbuf = None

5) Do kódu programu na správné místo přidejte tento kód:

    def on_drawingarea1_button_press_event(self, widget, event):
        infile = "./test.gif"
        self.pixbuf = gtk.gdk.pixbuf_new_from_file(infile)
        self.w('drawingarea1').window.draw_pixbuf(self.w('drawingarea1').get_style().fg_gc[gtk.STATE_NORMAL], self.pixbuf, 0, 0, 0, 0)

6) Stáhněte si nějaký slušný vzorový obrázek (např. tento), uložte ho do složky se svým programem a pojmenujte ho test.gif.


Obnovení obrázku po jeho překrytí (tzv. invalidation)

Když se stane nějaká událost (okno ztratí zaměření, změníte velikost atp.), tak se obrázek ztratí.

Je to proto, že se v těchto situacích přemaže a musí se softwarově obnovit. To do našeho programu snadno doplníme. V Glade nastavte obsluhu události expose-event a do programu dejte kód:

    def on_drawingarea1_expose_event(self, widget, event):
        print "redrawn"
        if self.pixbuf: 
            self.w('drawingarea1').window.draw_pixbuf(self.w('drawingarea1').window.new_gc(), self.pixbuf, 0, 0, 0, 0)

Událost kliknutí myší a kreslení

Rozeznat, zda uživatel kliknul do obrázku levým, pravým nebo středním tlačítkem, pomůže předaný parametr event.

Parametr event má i atributy event.x a event.y, která obsahují souřadnice kliknutí. (Ovšem jako desetinné číslo, float. WTF? Za to nemůžu...)


        if event.button == 1:        # left mouse button
            print "Levé tlačítko"
            gc = self.w('drawingarea1').window.new_gc() # get the graphic context
            gc.foreground = self.w('drawingarea1').get_colormap().alloc_color(0xaaaa, 0x0000, 0x0000) # RGB color
            self.w('drawingarea1').window.draw_rectangle(gc=gc, filled=False, 
                    x=0, y=0, width=int(event.x), height=int(event.y))
        if event.button == 2:        # mouse wheel
            print "Prostřední tlačítko"
        if event.button == 3:        # right m. b.
            print "Pravé tlačítko"

Spusťte program. Po kliknutí do okna by se měl načíst obrázek.


Zpět na obsah | Poslední úprava: 2012-02-20