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 :

Besoin d'explications sur le contexte Cairo


Sujet :

GTK+ avec Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut Besoin d'explications sur le contexte Cairo
    Explications Cairo

    Je voulais savoir pourquoi lorsque j'écris:

    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
    #! /usr/bin/env python
    # -*- coding:Latin-1 -*-
     
    import gtk
     
    window = gtk.Window()
    window.set_title("Animation PyGTK/Cairo")
     
    dessin = gtk.DrawingArea()
    dessin.set_size_request(400, 400)
    ct = dessin.window.cairo_create()
    ct.set_source_rgb(0.9, 0.1, 0.5)
    ct.rectangle(20, 20, 50, 50)
    ct.fill()
     
    window.add(dessin)
    window.show_all()
     
    gtk.main()
    Cela ne fonctionne pas, j'ai l'erreur:
    "AttributeError: 'NoneType' object has no attribute 'cairo_create".

    Alors que si je place la création du contexte Cairo dans une fonction, pas de souci.

    Exemple:

    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
    #! /usr/bin/env python
    # -*- coding:Latin-1 -*-
     
    import gtk
     
     
    def test(widget, data):
        ct = data.window.cairo_create()
        ct.set_source_rgb(0.9, 0.1, 0.5)
        ct.rectangle(20, 20, 50, 50)
        ct.fill()
     
     
    window = gtk.Window()
    window.set_title("Animation PyGTK/Cairo")
     
    dessin = gtk.DrawingArea()
    dessin.set_size_request(400, 400)
     
    bouton1 = gtk.Button("Test")
    bouton1.connect("clicked", test, dessin)
     
    vbox1 = gtk.VBox(False, 3)
    vbox1.pack_start(dessin)
    vbox1.pack_end(bouton1)
     
    window.add(vbox1)
    window.show_all()
     
    gtk.main()
    Merci pour vos éclaircissement concernant cette énigme.

    Cordialement,

    Damien

  2. #2
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    C'est un problème d'initialisation.

    Tant que le GtkDrawingArea n'est pas affiché il n'est pas initialisé. Tu ne peux donc pas accéder au context de Cairo.
    Un possibilité pour contourner le problème serait peut être de forcer l'initialisation avec la fonction gtk_widget_realize(); (l'équivalent doit exister en python). Mais je ne garantis pas le résultat.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut
    Banco !!! Merci Gérald.

    L'utilisation de la méthode "do_realize" (un simple "realize" ne fonctionne pas) après la création de la "DrawingArea" permet de résoudre le problème et de créer le contexte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dessin = gtk.DrawingArea()
    dessin.set_size_request(400, 400)
    dessin.do_realize(dessin)
    ct = dessin.window.cairo_create()
    Autre méthode, créer le contexte après le "show_all" de la fenêtre.
    Bon, ça c'est fait.

    Sauf que, bah oui, ça pouvait pas être aussi simple :p , lorsque je lance la boucle principale, si j'ai dessiné quelque chose, ça disparaît. What's the heck ?!

    Je sais que les questions paraissent stupides mais j'aimerai bien comprendre un peu mieux comment fonctionne la makina.

    Merci d'avance pour les explications.

    Damien

  4. #4
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 309
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 309
    Billets dans le blog
    5
    Par défaut
    Aucune question est stupide.

    Alors le principe de dessin est le suivant. Tout dessin est effectué lorsque le signal "draw" est envoyé. Donc si tu dessines en dehors du callback activé par le signal "draw" tu dessines dans le vide .

    Ceci étant dit, il ne te reste plus qu'à revoir tout ca.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 65
    Par défaut
    Merci encore pour les réponses, un petit résolu s'impose.

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

Discussions similaires

  1. Besoin d'explications sur les charset
    Par EGPMS dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 03/02/2006, 15h38
  2. [xml] Xpath besoin d'explication sur preceding-sibling::
    Par ekmule dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 10/01/2006, 09h32
  3. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 18h01
  4. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  5. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15

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