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

Tkinter Python Discussion :

dessiner un triangle sur canvas


Sujet :

Tkinter Python

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Par défaut dessiner un triangle sur canvas
    Voici un programme qui doit dessiner un cercle un carre et triangle avec la souris sur un canvas (tkinter). La partie qui dessine un triangle ne marche. A lma compilation il dit que " config " est innexistant. Il reconnait pas cette focntion.

    voici le code :


    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
    from Tkinter import *
     
     
    class Dessiner(Tk):
     
     
        def __init__(self):
            Tk.__init__(self)
     
            self.fig=StringVar()
            self.fig.trace("w", self.fig_callback)
     
     
            self.title("Dessiner: carre, triangle ou cercle")
            self.canvas=Canvas(self, bg='white', width=600, height=600)
            self.canvas.pack()
     
            #**************************************
            Button(self, text="Quitter", width=20, command=self.quit).pack(side=LEFT)
            self.bcarre = Button(self, text="Carre", fg='black', width=20, command=lambda: self.fig.set("Carre")).pack(side=LEFT)
            self.bcercle = Button(self, text="Cercle", fg='black', width=20, command=lambda: self.fig.set("Cercle")).pack(side=LEFT)
            self.btriangle = Button(self, text="Triangle", fg='black', width=20, command=lambda: self.fig.set("Triangle"))
            self.btriangle.pack(side=LEFT)
            #***************************************
     
            self.fig.set("Cercle")
            self.fig.set("Carre")
            self.fig.set("Triangle")
     
            self.canvas.bind('<ButtonPress-1>',self.clic)
            self.canvas.bind('<B1-Motion>',self.modif)
     
    #-----------------------------------------------------------------------------------------------------------------------
        def fig_callback(self, *args):
            if self.fig.get() == "Cercle":
                self.bcercle.config(fg='white')
                self.bcarre.config(fg='black')
                self.btriangle.config(fg='black')
     
                elif self.fig.get() == "Carre":
                self.bcercle.config(fg='black')
                self.bcarre.config(fg='white')
                self.btriangle.config(fg='black')
     
                elif self.fig.get() == "Triangle":
                self.bcercle.config(fg='black')
                self.bcarre.config(fg='black')
                self.btriangle.config(fg='white')
    #-----------------------------------------------------------------------------------------------------------------------
        def modif(self, event):
            self.x2=event.x
            self.y2=event.y
            self.x3=event.x
            self.y3=event.y
     
            if (self.fig.get() == "Cercle" or self.fig.get()== "Carre"):
                self.canvas.coords(self.item, self.x1, self.y1, self.x2, self.y2)
            if (self.fig.get() == "Triangle") :
                self.canvas.coords(self.item, self.x1, self.y1, self.x2, self.y2, self.x3, self.y3)
    #-----------------------------------------------------------------------------------------------------------------------
        def clic(self, event):
            self.x1=event.x
            self.y1=event.y
            self.x2=event.x
            self.y2=event.y
            self.x3=event.x
            self.y3=event.y
     
            if self.fig.get() == "Cercle":
                    self.item=self.canvas.create_oval(self.x1, self.y1, self.x2, self.y2, fill='black')
                  elif self.fig.get() == "Carre":
                        self.item=self.canvas.create_rectangle(self.x1, self.y1, self.x2, self.y2, fill='black')
                   elif self.fig.get() == "Triangle":
                        self.item=self.canvas.create_polygon(self.x1, self.y1, self.x2, self.y2,self.x3, self.y3, fill='black')
    #-----------------------------------------------------------------------------------------------------------------------
     
    if __name__== '__main__':
        fenetre=Dessiner()
            fenetre.mainloop()
    VOILA ? LA PARTIE QUI POSE PROBELE EST SIGNALE EN ROUGE ;

    Merci d'avance pour votre aide.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    76
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juillet 2008
    Messages : 76
    Par défaut
    Le soucis est lié à ta méthode pour récupérer les coordonnées de la souris. Avec le carré ou le cercle, pas de problèmes car tu définies x1 et y1 lors tu cliques puis tu ajustes les valeurs de x2 et y2 lorsque la souris se déplace et que le bouton est enfoncé.
    Avec le triangle, tu initialises ses coordonnées quand on clique la première fois puis tu mets à jour les valeurs de x2, y2, x3, y3 lorsque la souris bouge. A la fin de cet événement, la routine d'affichage s'arrête et dessine ton triangle... mais les points 2 et 3 sont identiques ! Du coup, on ne voit pas le triangle, il n'a pas de "hauteur" et reste sur une "ligne".

    La solution serait d'utiliser un autre event lorsque le bouton de la souris est relâché et enregistrer le point courant du triangle selon les coordonnées de la souris. Pareil pour terminer l'édition, tu pourrais utiliser le double clique.

  3. #3
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Moi c'est cette partie que je ne comprend pas :

    Citation Envoyé par kouhou88 Voir le message
    Voici un programme qui doit dessiner un cercle un carre et triangle avec la souris sur un canvas (tkinter). La partie qui dessine un triangle ne marche. A lma compilation il dit que " config " est innexistant. Il reconnait pas cette focntion.
    Le message exact ? Compilation ? Explique svp.

    @clic4 : Pour ce qui est de la différence entre create_oval/create_rectangle et create_polygon ok pour les coords mais son code est bon pour moi (Linux)...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.fig.set("Cercle")
    self.fig.set("Carre")
    self.fig.set("Triangle")
    Inutile non ? Tu initialise ta variable tk par défaut une fois et c'est tout.

    Autre chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def modif(self, event):
        self.x2=event.x
        self.y2=event.y
        self.x3=event.x
        self.y3=event.y
        if (self.fig.get() == "Cercle" or self.fig.get()== "Carre"):
            self.canvas.coords(self.item, self.x1, self.y1, self.x2, self.y2)
        elif (self.fig.get() == "Triangle") :
            self.canvas.coords(self.item, self.x1, self.y1, self.x2, self.y2, self.x3, self.y3)
    @+

  4. #4
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Je reprend la question sur le triangle

    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
    from Tkinter import *
     
    class Dessiner(Tk):
        def __init__(self):
            Tk.__init__(self)
     
            self.fig=StringVar()
            self.fig.trace("w", self.fig_callback)
     
            self.title("Dessiner: carre, triangle ou cercle")
     
            self.canvas=Canvas(self, bg="white", width=600, height=600)
            self.canvas.pack(side=TOP)
     
            frmbout = Frame(self) # Conteneur pour centrer les boutons
            frmbout.pack(side=TOP)
            Button(frmbout, text="Quit", command=self.destroy).pack(side=RIGHT, padx=5, pady=2, ipadx=2)
    	self.bcarre = Button(frmbout, text="Carre", fg="black", command=lambda: self.fig.set("Carre"))
    	self.bcarre.pack(side=RIGHT, padx=5, pady=2, ipadx=2)
    	self.bcercle = Button(frmbout, text="Cercle", fg="black", command=lambda: self.fig.set("Cercle"))
    	self.bcercle.pack(side=RIGHT, padx=5, pady=2, ipadx=2)
            self.btriangle = Button(frmbout, text="Triangle", fg="black", command=lambda: self.fig.set("Triangle"))
            self.btriangle.pack(side=RIGHT, padx=5, pady=2, ipadx=2)
     
            self.fig.set("Cercle") # Inutile d'initialiser self.fig plusieurs fois
     
            # Cela ne semble pas etre le sujet mais :
            # Il est aussi possible de gerer cela par evenement avec un self.fig=None comme flag
            # de l'état du bouton
            # Tu garde ton def clic
            # Tu fais un self.canvas.bind("<Motion>", modif) ou tu rajoute un test sur self.fig
            # Tu fais un bind self.canvas("<ButtonRelease-1>", self.clicoff) > def clicoff: self.fig=None
            # Cela te permet de vérifier la présence d'un item lors du clic pour le modifier par la suite. 
            self.canvas.bind("<ButtonPress-1>",self.clic)
            self.canvas.bind("<B1-Motion>",self.modif)
     
        def fig_callback(self, *args):
            if self.fig.get() == "Cercle":
                self.bcercle.config(fg="white")
                self.bcarre.config(fg="black")
                self.btriangle.config(fg="black")
     
            elif self.fig.get() == "Carre":
                self.bcercle.config(fg="black")
                self.bcarre.config(fg="white")
                self.btriangle.config(fg="black")
     
            elif self.fig.get() == "Triangle":
                self.bcercle.config(fg="black")
                self.bcarre.config(fg="black")
                self.btriangle.config(fg="white")
     
        def modif(self, event):
            # Pas besoin de reprendre les points x1 et y1. C'est le départ
            self.x2=event.x
            self.y2=event.y
     
            if self.fig.get() != "Triangle":
                self.canvas.coords(self.item, self.x1, self.y1, self.x2, self.y2)
            else:
                dist=self.x2 - self.x1 # Ton calcul pour le triangle n'étais pas bon.
                self.canvas.coords(self.item, self.x1-dist, self.y1+dist, self.x1, self.y1, self.x1+dist, self.y1+dist)
     
        def clic(self, event):
            self.x1=event.x
            self.y1=event.y
            if self.fig.get() == "Cercle":
                self.item=self.canvas.create_oval(self.x1, self.y1, self.x1, self.y1, fill="black")
            elif self.fig.get() == "Carre":
    	    self.item=self.canvas.create_rectangle(self.x1, self.y1, self.x1, self.y1, fill="black")
            elif self.fig.get() == "Triangle":
    	    self.item=self.canvas.create_polygon(self.x1, self.y1, self.x1, self.y1, self.x1, self.y1) # fill="black" inutile dans le cas du polygon.
     
    if __name__== "__main__":     
        fen=Dessiner()    
        fen.mainloop()
    C'est quoi l'erreur de compilation ?

    @+

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Par défaut
    le problème reste irrésolu, je ne vois vraiment pas comment y procéder. Je suis debutant avec tkinter, alllllooooo tout le monde au secours

  6. #6
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    J'avoue être perdu.
    Tu parle de non affichage du triangle et d'erreur de compilation.
    Pourrais tu redonner exactement ton problème ? (Je suis long parfois...)

    Merci

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 3
    Par défaut
    voyant c pas aussi complique que ça : pour compiler un fichier tu fait
    python nomfcihier.py sur la console : quand je fait ça il y a une fenetre qui s'affiche oû je dessine, et puis quand je reviens sur la console , je trouve des messages d'erreur. voila en clair

  8. #8
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonsoir,

    Ah... Python est un langage interprété. Lorsque tu fais python nomfcihier.py dans ta 'console' (ligne de commande ou IDLE ?). Pas de compilation.
    Je ne vais pas aller plus loin sur le sujet (merci de faire de même pour les autres, ce n'est pas le sujet). Regarde sur le net pour la différence entre un langage interprété ou compilé.

    Fais nous un copier/coller des messages svp.

    @+

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Bonsoir,
    A lma compilation il dit que " config " est innexistant
    ton message d'erreur n'indique pas du tout que config est inexistant, mais qu'un objet NoneType n'a pas d'attribut config.
    En fait dans ton code, self.bcarre et self.bcercle valent None, puisque la methode pack retourne None. il faut mettre en 2 lignes comme tu as fais pour self.btriangle.

  10. #10
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Bonjour,

    Bien vus nyko77
    En plus j'ai corrigé cela dans le code sans même y faire attention

    @+

  11. #11
    Membre Expert Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Par défaut
    Re,

    Citation Envoyé par PauseKawa Voir le message
    En plus j'ai corrigé cela dans le code sans même y faire attention
    A propos kouhou88, c'est mon code d'hier que tu teste ?

    PS : Ceci dit il existe peut etre d'autres solution que mon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.canvas.coords(self.item, self.x1-dist, self.y1+dist, self.x1, self.y1, self.x1+dist, self.y1+dist)
    pour le triangle.

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

Discussions similaires

  1. Redimensionner taille d'un TImage + dessin sur canvas
    Par Ben_Le_Cool dans le forum Langage
    Réponses: 2
    Dernier message: 21/07/2011, 16h39
  2. Problème de dessin sur Canvas
    Par ZouBi dans le forum Composants graphiques
    Réponses: 5
    Dernier message: 18/06/2011, 11h28
  3. [SWT] Dessin périodique sur canvas
    Par Knuckles dans le forum SWT/JFace
    Réponses: 1
    Dernier message: 29/11/2008, 13h33
  4. Réponses: 5
    Dernier message: 23/09/2006, 12h40
  5. Réponses: 1
    Dernier message: 05/08/2006, 20h43

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