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 : DrawingArea


Sujet :

GTK+ avec Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut pyGtk : DrawingArea
    Bonjour,

    je suis en train de commencer mon apprentissage avec pygtk.
    J'ai réalisé un premier programme d'automates cellulaires (Le jeux de la vie en est un mais ce n'est pas celui là que je programme). Peu importe. En fait je voudrais dessiner... et je n'y arrive pas.

    Par exemple dans le code ci-dessous, python me renvoie le message suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    File "Documents/prgm/python/gtk2/dessin-1.py", line 20, in __init__
        self.zoneDessin.window.draw_line(self.contGraph,0,0,300,300)
    AttributeError: 'NoneType' object has no attribute 'draw_line'
    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
     
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
     
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    class Dessin :
     
    	def __init__(self) :
    		mainWin = gtk.Window(gtk.WINDOW_TOPLEVEL)
     
    		# Zone de dessin
    		self.zoneDessin = gtk.DrawingArea()
    		self.zoneDessin.set_size_request(300,300)
    		mainWin.add(self.zoneDessin)
    		self.dessin = self.zoneDessin.window
    		self.style = self.zoneDessin.get_style()
    		self.contGraph = self.style.fg_gc[gtk.STATE_NORMAL]
    		self.zoneDessin.window.draw_line(self.contGraph,0,0,300,300)
    		self.zoneDessin.show()
    		mainWin.show()
    		mainWin.connect("destroy",self.finBoucle,None)
     
    	def finBoucle(self,widget, data = None) :
    		gtk.main_quit()
     
    if __name__ == "__main__" :
    	dessin = Dessin()
    	gtk.main()
    J'ai beau chercher, je ne comprends pas ce qui se passe.
    Merci de votre aide.

  2. #2
    Modérateur

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2009
    Messages
    1 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2009
    Messages : 1 395
    Points : 2 002
    Points
    2 002
    Par défaut
    C'est parce que tu tentes de dessiner dans un widget qui n'a même pas encore été créé (graphiquement parlant). self.zoneDessin.window est bien un gtk.gdk.Drawable, mais il n'existe pas encore (il vaut None, d'où ton erreur). Il n'existera qu'après que la pompe à événements aura été lancé (par l'appel à gtk.main) et que GTK aura créé les contextes graphiques nécessaires à son affichage. Tu es prévenu que c'est prêt par un signal de GtkWidget, dont hérite ta GtkDrawindArea. En général j'utilise le configure-event, qui est appelé quand la taille de la fenêtre a été choisie, il y a peut être un meilleur signal (map, realize ? Le mieux serait de tester pour voir à partir de quel événement le GdkWindow existe).

    Ensuite seulement tu pourras appeler draw_line. Le dessin doit se faire en réponse au signal "expose-event" (draw en GTK3 avec pyGObject).

    Tu as d'autres infos dans ce tutoriel GtkDrawingArea.
    Documentation officielle GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels GTK+ 3:
    GTK en C, GTK en Python

    Tutoriels par l'exemple (platform-demos):
    GTK (tous langages)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse qui m'a permis de corriger le code pour qu'il fonctionne (voir ci-dessous)..
    Mais j'ai encore des problèmes :

    Je reçois ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TypeError: dessin() takes at most 3 arguments (4 given)
    et mon script ne dessine absoluement rien !

    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
     
    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    # dessin-pygtk.py
     
    import pygtk
    pygtk.require('2.0')
    import gtk
     
    class Dessin :
     
    	def __init__(self) :
    		mainWin = gtk.Window(gtk.WINDOW_TOPLEVEL)
     
    		# Zone de dessin
    		self.zoneDessin = gtk.DrawingArea()
    		self.zoneDessin.set_size_request(300,300)
    		mainWin.add(self.zoneDessin)
    		mainWin.connect("configure_event",self.dessin, None)
    		self.zoneDessin.show()
    		mainWin.show()
    		mainWin.connect("destroy",self.finBoucle,None)
     
    	def finBoucle(self,widget, data = None) :
    		gtk.main_quit()
     
    	def dessin(self, widget, data = None) :
    		self.dessin = self.zoneDessin.window
    		self.style = self.zoneDessin.get_style()
    		self.contGraph = self.style.fg_gc[gtk.STATE_NORMAL]
    		self.zoneDessin.window.draw_line(self.contGraph,0,0,300,300)
     
    if __name__ == "__main__" :
    	dessin = Dessin()
    	gtk.main()

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Je me réponds à moi même : j'ai fini par trouver.
    Il faut écrire ligne 26 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	def dessin(self, widget, event, data = None) :
    Peut-être sera-ce utile à quelqu'un !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Ressources pour PyGTK (documentation, liens...)
    Par Community Management dans le forum GTK+ avec Python
    Réponses: 2
    Dernier message: 25/09/2014, 21h07
  2. [JPanel] Convertir un drawingArea ou JPanel en Image
    Par kanabitch dans le forum AWT/Swing
    Réponses: 9
    Dernier message: 30/09/2009, 09h55
  3. Question sur DrawingArea
    Par argon dans le forum GTK+ avec C & C++
    Réponses: 5
    Dernier message: 23/01/2007, 10h00
  4. Dessin dans un drawingArea
    Par jean-pierre96 dans le forum GTK+ avec C & C++
    Réponses: 1
    Dernier message: 13/12/2006, 15h25

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