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 :

Manipuler plusieurs objets simples comme un seul objet dans un canvas.


Sujet :

Tkinter Python

  1. #1
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut Manipuler plusieurs objets simples comme un seul objet dans un canvas.
    Je voudrais pouvoir utiliser les formes simples qu'il y a moyen de dessiner sur un canvas pour créer des formes plus complexes (exemple : des bonhommes d'use-cases, des rectangles avec textes, etc...) et les déplacer ensuite comme un seul objet.

    Quand on regarde cet exemple :

    http://python.developpez.com/cours/T...apitre14#L14.3

    On constate que l'on peut "manipuler" une forme simple grâce à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    self.c.bind("<Button-1>", self.mouseDown)
    self.c.bind("<Button1-Motion>", self.mouseMove)
    self.c.bind("<Button1-ButtonRelease>", self.mouseUp)
    et grâce à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.selObject = self.c.find_closest(self.x1, self.y1)
    Si maintenant je veux placer une forme plus complexe, constituée elle-même de formes simples. Mais je veux pouvoir la sélectionner à la souris, et faire en sorte que tous les éléments de ma forme complexe se déplacent en même temps.

    Exemple, ce bonhomme composé d'un cercle et de 7 rectangles.



    Je suppose que je dois commencer par créer une classe qui va instancier un objet qui va garder les références des divers objets constituant le bonhomme.

    Mais ensuite, quand je vais sélectionner mon bonhomme grâce à ma souris en cliquant-glissant sur son bras, par exemple, comment indiquer au programme que je veux que tous les éléments du bonhomme se déplacent de la même façon que je déplace le bras ? Et que cela n'interfère pas avec un autre dessin de bonhomme (résultat d'une autre instanciation de la classe bonhomme) ?

    Je ne sais pas si je suis clair ?

  2. #2
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Voici un exemple qui trace 3 instances de bonhommes sur un même canvas :

    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
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    from Tkinter import *
     
    class Bonhomme:
        def __init__(self, unite, x, y, canv):
            self.bras1 = canv.create_rectangle(x,y+(3*unite),x+(2*unite),y+(4*unite), fill="#FFCCFF")
            self.bras2 = canv.create_rectangle(x+(5*unite),y+(3*unite),x+(7*unite),y+(4*unite), fill="#FFCCFF")
            self.buste = canv.create_rectangle(x+(2*unite),y+(3*unite),x+(5*unite),y+(6*unite), fill="#990033")
            self.tete = canv.create_oval(x+(2*unite),y,x+(5*unite),y+(3*unite), fill="#FFCCFF")
            self.jambe1 = canv.create_rectangle(x+(2*unite),y+(6*unite),x+(3*unite),y+(8*unite), fill="#757575")
            self.jambe2 = canv.create_rectangle(x+(4*unite),y+(6*unite),x+(5*unite),y+(8*unite), fill="#757575")
            self.pied1 = canv.create_rectangle(x+(1*unite),y+(8*unite),x+(3*unite),y+(9*unite), fill="#CC6600")
            self.pied2 = canv.create_rectangle(x+(4*unite),y+(8*unite),x+(6*unite),y+(9*unite), fill="#CC6600")
     
    class Application:
        def __init__(self):
            self.root=Tk()
            self.root.title('bonhomme complexe')
     
            self.root.geometry("600x400")
     
            self.barreEtat = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
            self.barreEtat.pack(side=BOTTOM, fill=X)
     
            la = 600
            ha = 400
     
            self.c = Canvas(self.root, bg="white", width=la, height=ha)
            self.c.pack(side=TOP, fill=BOTH, expand=YES)
     
            bonhomme1 = Bonhomme(20,  20,  30, self.c)
            bonhomme2 = Bonhomme(30, 200,  50, self.c)
            bonhomme3 = Bonhomme(10, 450,  10, self.c)
     
            self.root.mainloop()
     
    # départ du programme principal :
    if __name__ == '__main__':
        app = Application()
    Mais je me casse encore la tête pour savoir comment je vais pouvoir repérer l'instance d'un objet bonhomme à partir de la sélection d'un des constituants du bonhomme ????

  3. #3
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Avec cette version du programme inspirée du cours de Gérard Swinnen, je peux déplacer chaque élément séparémment, peu importe de quel bonhomme.

    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
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    from Tkinter import *
     
    class Bonhomme:
        def __init__(self, unite, x, y, canv):
            self.bras1 = canv.create_rectangle(x,y+(3*unite),x+(2*unite),y+(4*unite), fill="#FFCCFF")
            self.bras2 = canv.create_rectangle(x+(5*unite),y+(3*unite),x+(7*unite),y+(4*unite), fill="#FFCCFF")
            self.buste = canv.create_rectangle(x+(2*unite),y+(3*unite),x+(5*unite),y+(6*unite), fill="#990033")
            self.tete = canv.create_oval(x+(2*unite),y,x+(5*unite),y+(3*unite), fill="#FFCCFF")
            self.jambe1 = canv.create_rectangle(x+(2*unite),y+(6*unite),x+(3*unite),y+(8*unite), fill="#757575")
            self.jambe2 = canv.create_rectangle(x+(4*unite),y+(6*unite),x+(5*unite),y+(8*unite), fill="#757575")
            self.pied1 = canv.create_rectangle(x+(1*unite),y+(8*unite),x+(3*unite),y+(9*unite), fill="#CC6600")
            self.pied2 = canv.create_rectangle(x+(4*unite),y+(8*unite),x+(6*unite),y+(9*unite), fill="#CC6600")
     
    class Application:
        def __init__(self):
            self.root=Tk()
            self.root.title('bonhomme complexe')
     
            self.root.geometry("600x400")
     
            self.barreEtat = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
            self.barreEtat.pack(side=BOTTOM, fill=X)
     
            la = 600
            ha = 400
     
            self.c = Canvas(self.root, bg="white", width=la, height=ha)
            self.c.pack(side=TOP, fill=BOTH, expand=YES)
     
            self.c.bind("<Button-1>", self.mouseDown)
            self.c.bind("<Button1-Motion>", self.mouseMove)
            self.c.bind("<Button1-ButtonRelease>", self.mouseUp)
     
            bonhomme1 = Bonhomme(20,  20,  30, self.c)
            bonhomme2 = Bonhomme(30, 200,  50, self.c)
            bonhomme3 = Bonhomme(10, 450,  10, self.c)
     
            self.root.mainloop()
     
        def mouseDown(self, event):
            self.currObject =None
            self.x1, self.y1 = event.x, event.y
            self.selObject = self.c.find_closest(self.x1, self.y1)
     
        def mouseMove(self, event):
            x2, y2 = event.x, event.y
            dx, dy = x2 -self.x1, y2 -self.y1
            if self.selObject:
                self.c.move(self.selObject, dx, dy)
                self.x1, self.y1 = x2, y2
     
        def mouseUp(self, event):
            if self.selObject:
                self.c.itemconfig(self.selObject, width =1)
                self.selObject =None
     
     
    # départ du programme principal :
    if __name__ == '__main__':
        app = Application()
    Mais je cherche encore comment déplacer intégralement un bonhomme dans son entièreté avec la souris ???

  4. #4
    Membre actif
    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
    Points : 290
    Points
    290
    Par défaut
    Bonjour,
    Si tu veux asocier plusieurs éléments ensemble, il suffit de mettre le même argument tags à tous les éléments. Tu peux récupérer le tag de l'élément sélectionné avec .gettags et tu n'as plus qu'à mettre le nom du tag dans la méthode .move(tag), et tous les élément vont se déplacer en même 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
     
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    from Tkinter import *
     
    class Bonhomme:
        def __init__(self, unite, x, y, canv, tag):
            self.bras1 = canv.create_rectangle(x,y+(3*unite),x+(2*unite),y+(4*unite), fill="#FFCCFF", tags=tag)
            self.bras2 = canv.create_rectangle(x+(5*unite),y+(3*unite),x+(7*unite),y+(4*unite), fill="#FFCCFF", tags=tag)
            self.buste = canv.create_rectangle(x+(2*unite),y+(3*unite),x+(5*unite),y+(6*unite), fill="#990033", tags=tag)
            self.tete = canv.create_oval(x+(2*unite),y,x+(5*unite),y+(3*unite), fill="#FFCCFF", tags=tag)
            self.jambe1 = canv.create_rectangle(x+(2*unite),y+(6*unite),x+(3*unite),y+(8*unite), fill="#757575", tags=tag)
            self.jambe2 = canv.create_rectangle(x+(4*unite),y+(6*unite),x+(5*unite),y+(8*unite), fill="#757575", tags=tag)
            self.pied1 = canv.create_rectangle(x+(1*unite),y+(8*unite),x+(3*unite),y+(9*unite), fill="#CC6600", tags=tag)
            self.pied2 = canv.create_rectangle(x+(4*unite),y+(8*unite),x+(6*unite),y+(9*unite), fill="#CC6600", tags=tag)
     
    class Application:
        def __init__(self):
            self.root=Tk()
            self.root.title('bonhomme complexe')
     
            self.root.geometry("600x400")
     
            self.barreEtat = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
            self.barreEtat.pack(side=BOTTOM, fill=X)
     
            la = 600
            ha = 400
     
            self.c = Canvas(self.root, bg="white", width=la, height=ha)
            self.c.pack(side=TOP, fill=BOTH, expand=YES)
     
            self.c.bind("<Button-1>", self.mouseDown)
            self.c.bind("<Button1-Motion>", self.mouseMove)
            self.c.bind("<Button1-ButtonRelease>", self.mouseUp)
     
            bonhomme1 = Bonhomme(20,  20,  30, self.c, "bonh1")
            bonhomme2 = Bonhomme(30, 200,  50, self.c, "bonh2")
            bonhomme3 = Bonhomme(10, 450,  10, self.c, "bonh3")
     
            self.root.mainloop()
     
        def mouseDown(self, event):
    		self.x1, self.y1 = event.x, event.y
    		selObject = self.c.find_closest(self.x1, self.y1)
    		self.selTag = self.c.gettags(selObject)[0]
    		print self.selTag
     
        def mouseMove(self, event):
            x2, y2 = event.x, event.y
            dx, dy = x2 -self.x1, y2 -self.y1
            if self.selTag:
                self.c.move(self.selTag, dx, dy)
                self.x1, self.y1 = x2, y2
     
        def mouseUp(self, event):
            if self.selObject:
                self.c.itemconfig(self.selObject, width =1)
                self.selTag =None
     
     
    # départ du programme principal :
    if __name__ == '__main__':
        app = Application()

  5. #5
    Membre confirmé Avatar de calogerogigante
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 497
    Points
    497
    Par défaut
    Merci nyko !!!
    Génial !!!

    Je ne savais pas que tags pouvait servir à ça, déplacer des objets de façon groupée !!!

    J'ai fait encore quelques légères modifications à ton code très instructif (je place les noms en dessous des bonshommes et je corrige une petite erreur due à un self.selObject qui n'est plus utilisé dans ton 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
    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
    #!/usr/local/bin/python
    # -*- coding:utf-8 -*-
    from Tkinter import *
     
    class Bonhomme:
        def __init__(self, unite, x, y, canv, tag):
            self.nom = canv.create_text(x+unite,y+(10*unite),text=tag, tags=tag)
            self.bras1 = canv.create_rectangle(x,y+(3*unite),x+(2*unite),y+(4*unite), fill="#FFCCFF", tags=tag)
            self.bras2 = canv.create_rectangle(x+(5*unite),y+(3*unite),x+(7*unite),y+(4*unite), fill="#FFCCFF", tags=tag)
            self.buste = canv.create_rectangle(x+(2*unite),y+(3*unite),x+(5*unite),y+(6*unite), fill="#990033", tags=tag)
            self.tete = canv.create_oval(x+(2*unite),y,x+(5*unite),y+(3*unite), fill="#FFCCFF", tags=tag)
            self.jambe1 = canv.create_rectangle(x+(2*unite),y+(6*unite),x+(3*unite),y+(8*unite), fill="#757575", tags=tag)
            self.jambe2 = canv.create_rectangle(x+(4*unite),y+(6*unite),x+(5*unite),y+(8*unite), fill="#757575", tags=tag)
            self.pied1 = canv.create_rectangle(x+(1*unite),y+(8*unite),x+(3*unite),y+(9*unite), fill="#CC6600", tags=tag)
            self.pied2 = canv.create_rectangle(x+(4*unite),y+(8*unite),x+(6*unite),y+(9*unite), fill="#CC6600", tags=tag)
     
    class Application:
        def __init__(self):
            self.root=Tk()
            self.root.title('bonhomme complexe')
     
            self.root.geometry("600x400")
     
            self.barreEtat = Label(self.root, text="", bd=1, relief=SUNKEN, anchor=W)
            self.barreEtat.pack(side=BOTTOM, fill=X)
     
            la = 600
            ha = 400
     
            self.c = Canvas(self.root, bg="white", width=la, height=ha)
            self.c.pack(side=TOP, fill=BOTH, expand=YES)
     
            self.c.bind("<Button-1>", self.mouseDown)
            self.c.bind("<Button1-Motion>", self.mouseMove)
            self.c.bind("<Button1-ButtonRelease>", self.mouseUp)
     
            bonhomme1 = Bonhomme(20,  20,  30, self.c, "bonh-1")
            bonhomme2 = Bonhomme(30, 200,  50, self.c, "bonh-2")
            bonhomme3 = Bonhomme(10, 450,  10, self.c, "bonh-3")
     
            self.root.mainloop()
     
        def mouseDown(self, event):
            self.x1, self.y1 = event.x, event.y
            selObject = self.c.find_closest(self.x1, self.y1)
            self.selTag = self.c.gettags(selObject)[0]
            self.barreEtat.config(text=self.selTag)
     
        def mouseMove(self, event):
            x2, y2 = event.x, event.y
            dx, dy = x2 -self.x1, y2 -self.y1
            if self.selTag:
                self.c.move(self.selTag, dx, dy)
                self.x1, self.y1 = x2, y2
     
        def mouseUp(self, event):
            self.selTag = None
            self.barreEtat.config(text="Pas de sélection")
     
     
    # départ du programme principal :
    if __name__ == '__main__':
        app = Application()
    Merci, ça marche super bien, c'est super et ça ouvre la porte à des applications graphiques un peu plus sophistiquées que ce que l'on sait faire simplement avec des formes simples...

    Je mets tout ça en résolu !

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

Discussions similaires

  1. [2.x] Formulaire avec plusieurs sélects pour un seul objet
    Par yamatoshi dans le forum Symfony
    Réponses: 1
    Dernier message: 22/11/2014, 17h17
  2. Un seul objet context ou plusieurs context par form
    Par laumon dans le forum VB.NET
    Réponses: 0
    Dernier message: 21/12/2011, 16h24
  3. Modifier la couleur d'un seul objet d'une ListBox
    Par [Silk] dans le forum Composants VCL
    Réponses: 8
    Dernier message: 03/01/2006, 21h55
  4. 2 compositions pour un seul objet
    Par Jorus dans le forum Diagrammes de Classes
    Réponses: 6
    Dernier message: 31/10/2005, 13h41
  5. Réponses: 13
    Dernier message: 25/01/2005, 10h05

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