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.
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)
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.