IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

GTK+ avec Python Discussion :

Pygtk: comment utiliser le widget Drawing Area


Sujet :

GTK+ avec Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut Pygtk: comment utiliser le widget Drawing Area
    Salut à tous,

    apres avoir lu, re-lu et rere-lu les tuto expliquant comment utiliser le widget DrawingArea avec pygtk je n'arrive toujours pas à dessiner un point ou tracer un trait.

    Est-ce que qu'une ame charitable pourrait me donner un exemple de code simple et complet pour utiliser le widget DrawingArea afin d'afficher une suite de point et tracer des traits.


    Merci.

  2. #2
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Salut,

    J'avais fait un truc avec une DrawingArea il y a quelques temps :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
     
    import pygtk
    pygtk.require('2.0')
    import gtk
    import cairo
     
    #------------------------------------------------------------------------------
     
    class Reservoir(gtk.DrawingArea):
        """Dessine un reservoir partiellement rempli en couleur."""
     
        def __init__(self, color, percent):
            gtk.DrawingArea.__init__(self)
            self.connect('expose-event', self.ev_expose)
            self.c = color
            self.p = percent
            self.txt = str(self.p) + "%"
            if sum(map(lambda x: x**2, color)) < 0.1:
                self.fg = 0.5
            else:
                self.fg = 0.0
            return
     
        def ev_expose(self, widget=None, event=None):
            """Gestion de l'affichage et du redimensionnement."""
            self.context = widget.window.cairo_create()
            self.context.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
            self.context.clip()
            self.draw()
            return False
     
        def draw(self):
            """Dessine le reservoir."""
            self.context.set_line_width(2.0)
            self.context.set_line_cap(cairo.LINE_CAP_ROUND)
            self.context.set_line_join(cairo.LINE_JOIN_ROUND)
            rect = self.get_allocation()
            r = rect.height - 4
            if r < 0:
                r = 0
            if self.p != None:
                n = 2+(r*(100-self.p))/100
                # Fond
                self.context.set_source_rgb(1.0, 1.0, 1.0)
                self.context.rectangle(rect.width/4, 2, rect.width/2, r)
                self.context.fill()
                # Niveau
                self.context.set_source_rgb(self.c[0], self.c[1], self.c[2])
                self.context.rectangle(rect.width/4, n, rect.width/2, r-n+2)
                self.context.fill()
                # Texte
                xb, yb, w, h =self.context.text_extents(self.txt)[:4]
                self.context.set_source_rgb(self.fg, self.fg, self.fg)
                self.context.move_to((rect.width-w)/2-xb, (rect.height-h)/2-yb)
                self.context.show_text(self.txt)
            # Contour
            self.context.set_source_rgb(0.0, 0.0, 0.0)
            self.context.rectangle(rect.width/4, 2, rect.width/2, r)
            self.context.stroke()
            # Graduations
            self.context.set_source_rgba(0.0, 0.0, 0.0, 0.5)
            self.context.move_to(rect.width/4, rect.height/2)
            self.context.line_to((3*rect.width)/10, rect.height/2)
            self.context.move_to(rect.width/4, 1+r/4)
            self.context.line_to((3*rect.width)/10, 1+r/4)
            self.context.move_to(rect.width/4, 3+3*r/4)
            self.context.line_to((3*rect.width)/10, 3+3*r/4)
            self.context.stroke()
            return
     
     
    #------------------------------------------------------------------------------
     
    if __name__ == '__main__':
        win = gtk.Window()
        win.connect('destroy', gtk.main_quit)
        win.set_default_size(150, 250)
        r = Reservoir([0.0, 1.0, 1.0], 33)
        win.add(r)
        win.show_all()
        gtk.main()
     
    #------------------------------------------------------------------------------

    J'utilise Cairo pour faire les dessins.

    Quelques liens utiles :
    http://www.pygtk.org/articles/cairo-...tk-widgets.htm
    http://www.tortall.net/mu/wiki/CairoTutorial
    http://cairographics.org/samples/


    -

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Merci beaucoup.

    Je suis pas encore sorti du tunnel parce que je maitrise pas trop le python mais maintenant j'ai les bases qui me manquaient.


    A+

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Je te remercie encore pour ton coup de main, j'arrive maintenant a dessiner ce que je vaux dans une DrawingArea mais je n'arrive pas à dessiner de maniere dynamique dedans.

    la fonction expose_event n'accepte pas d'autres arguments que ce de bases.

    En gros je voudrais faire avancer un point à travers ma DrawingArea, par exemple 1 pixel/sec.

    Merci de votre aide.

  5. #5
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    La fonction "ev_expose" sert à gérer l'évènement "expose-event", qui est émis lorsque la fenêtre est redimensionnée => pas touche (si tu veux faire autre chose que détecter un redimensionnement, c'est ailleurs qu'il faut faire des modifs)


    Si tu veux simplement faire une petite anim, ce code est largement suffisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    import pygtk
    pygtk.require('2.0')
    import gtk
    import cairo
    import gobject
     
    #------------------------------------------------------------------------------
     
    class Rebond(gtk.DrawingArea):
        """Dessine une balle qui rebondit."""
     
        def __init__(self):
            gtk.DrawingArea.__init__(self)
            self.balle = [0, 0, 2, 2]     # x, y, vitesse_x, vitesse_y
            gobject.timeout_add(10, self.draw)
     
        def draw(self):
            rect = self.get_allocation()
            self.context = self.window.cairo_create()
            self.context.rectangle(0, 0, rect.width, rect.height)
            self.context.clip()
            self.context.set_line_width(5.0)
            self.context.set_line_cap(cairo.LINE_CAP_ROUND)
            self.context.set_line_join(cairo.LINE_JOIN_ROUND)
            # Fond
            self.context.set_source_rgb(1.0, 1.0, 1.0)
            self.context.rectangle(0, 0, rect.width, rect.height)
            self.context.fill()
            # Balle
            self.balle[0:2] = [self.balle[0]+self.balle[2], self.balle[1]+self.balle[3]]
            if self.balle[0] > rect.width:
                self.balle[0] = 2*rect.width - self.balle[0]
                self.balle[2] = -2
            if self.balle[1] > rect.height:
                self.balle[1] = 2*rect.height - self.balle[1]
                self.balle[3] = -2
            if self.balle[0] < 0:
                self.balle[0] = -self.balle[0]
                self.balle[2] = 2
            if self.balle[1] < 0:
                self.balle[1] = -self.balle[1]
                self.balle[3] = 2
            self.context.set_source_rgb(1.0, 0.0, 0.0)
            self.context.move_to(self.balle[0], self.balle[1])
            self.context.line_to(self.balle[0], self.balle[1])
            self.context.stroke()
            return True
     
    #------------------------------------------------------------------------------
     
    if __name__ == '__main__':
        win = gtk.Window()
        win.connect('destroy', gtk.main_quit)
        win.set_default_size(150, 250)
        r = Rebond()
        win.add(r)
        win.show_all()
        gtk.main()
     
    #------------------------------------------------------------------------------


    PS : j'ai vu que tu as fait un double post ; tu peux mettre l'autre en délestage (bouton en bas) pour que les admin sachent qu'il est à supprimer

    -

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 11
    Par défaut
    Je te remercie. J'ai réussi à faire ce que je voulais mais il me reste un soucis.

    En gros mon programme dessine un point qui se pdeplace sur un fond à l'image du code que tu m'as passe. Mais il se deplace sur fond que je redessine à chque passage et le rafraichissement se voit.

    J'ai pensé à enregistrer la premiere fois que je dessine le fond et de le charger apres ou de charger charger le fond sous forme "d'image.png" mais je n'ai pas réussi à implanter ni l'une ni l'autre


    Merci de ton aide.

Discussions similaires

  1. PyGTK, Drawing Area et rafraîchissement de fenêtre.
    Par austin57 dans le forum GTK+ avec Python
    Réponses: 6
    Dernier message: 20/12/2011, 21h17
  2. Réponses: 11
    Dernier message: 04/10/2011, 12h53
  3. Comment utiliser tooltip sur <map> <area shape> ?
    Par tidou95220 dans le forum jQuery
    Réponses: 4
    Dernier message: 07/09/2011, 15h20
  4. Widget Drawing Area
    Par Invité dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 13/01/2011, 14h28
  5. Comment sauvegarder le contenu d'une drawing area ?
    Par khorhil dans le forum GTK+ avec C & C++
    Réponses: 2
    Dernier message: 18/06/2009, 14h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo