2009-04-22 8 views
1

J'essaye de faire une application GTK en python où je peux simplement dessiner une image chargée sur l'écran où je clique dessus. La façon dont j'essaye de faire ceci est en chargeant l'image dans un fichier pixbuf, puis en dessinant ce pixbuf sur une zone de dessin.dessiner un pixbuf sur une zone de dessin en utilisant pygtk et glade

la ligne principale de code est ici:

def drawing_refresh(self, widget, event): 
    #clear the screen 
    widget.window.draw_rectangle(widget.get_style().white_gc, True, 0, 0, 400, 400) 
    for n in self.nodes: 
     widget.window.draw_pixbuf(widget.get_style().fg_gc[gtk.STATE_NORMAL], 
            self.node_image, 0, 0, 0, 0) 

Cela devrait simplement attirer l'pixbuf sur l'image dans le coin en haut à gauche, mais rien ne montre que l'image blanche. J'ai testé que le pixbuf se charge en le mettant dans une image gtk. Qu'est-ce que je fais mal ici?

Répondre

2

J'ai découvert que j'ai juste besoin d'obtenir la fonction pour appeler un autre événement d'exposition avec widget.queue_draw() à la fin de la fonction. La fonction n'était appelée qu'une seule fois au début, et il n'y avait pas de nœuds disponibles à ce stade, donc rien n'était dessiné.

1

Pour ce faire, vous pouvez utiliser le cairo. Tout d'abord, créez une classe basée sur gtk.DrawingArea et connectez l'événement d'exposition à votre fonction d'exposition.

class draw(gtk.gdk.DrawingArea): 
    def __init__(self): 
     self.connect('expose-event', self._do_expose) 
     self.pixbuf = self.gen_pixbuf_from_file(PATH_TO_THE_FILE) 

    def _do_expose(self, widget, event): 
     cr = self.window.cairo_create() 
     cr.set_operator(cairo.OPERATOR_SOURCE) 
     cr.set_source_rgb(1,1,1) 
     cr.paint() 
     cr.set_source_pixbuf(self.pixbuf, 0, 0) 
     cr.paint() 

Ceci dessine l'image chaque fois que l'événement d'exposition est émis.

Questions connexes