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 :

Rotation dans un canvas (le retour)


Sujet :

Tkinter Python

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Rotation dans un canvas (le retour)
    Bonjour à tous,

    Le titre est assez explicite, je cherche à faire des rotations sur des triangles dans un Canvas.

    J'ai réussi à trouver un algo qui me distingue de mes camarades, mais j'ai vraiment du mal à l'implementer dans mon code...

    Ci joint l algo :
    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
     
    def getangle(event):
        dx = c.canvasx(event.x) - center[0]
        dy = c.canvasy(event.y) - center[1]
        try:
            return complex(dx, dy) / abs(complex(dx, dy))
        except ZeroDivisionError:
            return 0.0 # cannot determine angle
     
    def press(event):
        # calculate angle at start point
        global start
        start = getangle(event)
     
    def motion(event):
        # calculate current angle relative to initial angle
        global start
        angle = getangle(event) / start
        offset = complex(center[0], center[1])
        newxy = []
        for x, y in xy:
            v = angle * (complex(x, y) - offset) + offset
            newxy.append(v.real)
            newxy.append(v.imag)
        c.coords(polygon_item, *newxy)
     
    c.bind("<Button-1>", press)
    c.bind("<B1-Motion>", motion)
    Dans mon code, j'appelle la fonction rotation à partir d'un menu...

    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
     
    def rotation(self, event):
    		"""Permet de rotation les figures dans le sens souhaite a l aide d un clic sur un des sommets"""
    		self.canvas.bind("<Button-1>", self.press)
    		self.canvas.bind("<B1-Motion>", self.motion)
    		self.canvas.bind('<ButtonRelease-1>',self.mouseup)
     
     
        def press(self, event):
    		self.x,self.y=event.x,event.y
    		self.tag=(self.canvas.find_closest(self.x,self.y, halo=None))[0]
    		#self.figure=self.select(self.tag)
    		self.figure=self.tag
    		self.center=self.figure.absCentre, self.figure.ordCentre
    		self.start = self.getangle(event)
    		self.xy=zip([x for i, x in enumerate(self.canvas.coords(self.ID)) if i%2 == 0],[y for i, y in enumerate(self.canvas.coords(self.ID)) if i%2 == 1])
     
        def getangle(self, event):
    		dx = self.canvas.canvasx(event.x) - self.center[0]
    		dy = self.canvas.canvasy(event.y) - self.center[1]
    		try:
    			return complex(dx, dy) / abs(complex(dx, dy))
    		except ZeroDivisionError:
    			return 0.0 # cannot determine angle
     
        def motion(self, event):
    		angle = self.getangle(event) / self.start
    		offset = complex(self.center[0], self.center[1])
    		newxy = []
    		for x, y in self.xy:
    			v = angle * (complex(x, y) - offset) + offset
    			newxy.append(v.real)
    			newxy.append(v.imag)
    		self.figure.rotation(self.canvas, *newxy)
    Maintenant, quand je lance le script, et que je clique sur le bouton pivoter , il me renvoie des erreurs du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ObjType=self.canvas.gettags(self.selObject)[0]
    IndexError: tuple index out of range
    Alors j'ai essayé de suivre le chemin, et je pense que ça bloque au niveau de la fonction press... mais bon je bloque .

    Merci d avance.

  2. #2
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Je ne vois pas le ObjType=self.canvas.gettags(self.selObject)[0] dans ton code mais un print self.selObject (ou un print dir(self.selObject)) juste avant devrais t'en dire plus.

    @+

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Je vais faire les choses bien :

    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
    def clic(self, event):  
    	"""Fonction qui permet de creer une figure ou de la deplacer si une selection est en cours"""
            if self.selObject:
                # Une sélection est en cours : déplacement
                newposx=event.x
                newposy=event.y
                if self.selObject:
                    ListCords = self.canvas.coords(self.selObject)
    		print dir(self.selObject)
                    ObjType=self.canvas.gettags(self.selObject)[0]
     
                    x1=ListCords[0]
                    y1=ListCords[1]
                    x2=ListCords[2]
                    y2=ListCords[3]
     
                    if ObjType != 'Triangle':
                        demilargeur=(x2-x1)/2
                        demihauteur=(y2-y1)/2
                        self.canvas.coords(self.selObject, newposx-demilargeur, newposy-demihauteur, newposx+demilargeur, newposy+demihauteur)
                    else:
                        x3=ListCords[4]
                        y3=ListCords[5]
                        demilargeur=(x3-x1)/2
                        if y2>y1: # Prise en compte du sommet
                            demihauteur=(y2-y1)/2
                            self.canvas.coords(self.selObject, newposx-demilargeur, newposy-demihauteur, newposx, newposy+demihauteur, newposx+demilargeur, newposy-demihauteur)
                        else:
                            demihauteur=(y1-y2)/2
                            self.canvas.coords(self.selObject, newposx-demilargeur, newposy+demihauteur, newposx, newposy-demihauteur, newposx+demilargeur, newposy+demihauteur)
                self.clearscreen()
            else:
                # Création d'une nouvelle fig
                self.clearscreen()
                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", tag='Cercle')
                elif self.fig.get() == "Carre":
                    self.item=self.canvas.create_rectangle(self.x1, self.y1, self.x1, self.y1, fill="black", tag='Carre')
                elif self.fig.get() == "Triangle":
                    self.item=self.canvas.create_polygon(self.x1, self.y1, self.x1, self.y1, self.x1, self.y1, tag='Triangle')

    Alors que dans ma fonction rotation, j'appelle pas la foncton clic, pourquoi ai je cette erreur ?!

    PS : le print dir(self.selObject) me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ['__add__', '__class__', '__contains__', '__delattr__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__getslice__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
    PPS : Modification de la fonction rotation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    def rotation(self, event): # ne fonctionne pas 
    		"""Permet de rotation les figures dans le sens souhaite a l aide d un clic sur un des sommets"""
    		self.canvas.unbind("<ButtonPress-1>",self.clic) #erreur liee a cette fonction : objType index tuple error
    		self.canvas.unbind("<B1-Motion>",self.modif)
     
     
    		self.canvas.bind("<ButtonPress-1>", self.press)
    		self.canvas.bind("<B1-Motion>", self.motion)
    		self.canvas.bind('<ButtonRelease-1>',self.mouseup)

  4. #4
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonsoir,

    Pas le temps de regarder ce soir mais :
    ObjType=self.canvas.gettags(self.selObject)[0]
    Tu ne gère pas tes erreurs.
    Fais un print self.canvas.gettags(self.selObject) juste avant pour trouver ton erreur.

    Bon code

  5. #5
    Expert confirmé 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
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Donc tu utilise des Widgets pour gérer tes actions (rotations etc) via un bind de tes fonctions.
    Le problème étant que lorsque tu est en rotation le bind sur <ButtonPress-1> lance self.clic.

    C'est bien cela ?

    Ton code devrais donc être :
    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
     
     
    def <fonction de déplacement/sélection>(self, event):
        self.canvas.bind("<Button-1>", self.clic)
        ....
     
    def rotation(self, event):
        self.canvas.bind("<Button-1>", self.press)
        self.canvas.bind("<B1-Motion>", self.motion)
        self.canvas.bind('<ButtonRelease-1>',self.mouseup)
     
     
    def press(self, event):
        ....
     
    def getangle(self, event):
        ....
     
    def motion(self, event):
        ....
     
    def clic(self, event):
        ....
    Ma question viens du fait que je ne comprend pas ton indentation ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    def rotation(self, event):
     
    ....def press(self, event):
     
    ....def getangle(self, event):
     
    ....def motion(self, event):
    Note : Le unbind n'est pas nécessaire, le bind écrase l'affectation. Mais bon, cela ne gène en rien.

    @+

    PS : A propos, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		self.canvas.unbind("<ButtonPress-1>")
    		self.canvas.unbind("<B1-Motion>")

Discussions similaires

  1. script perl dans script perl et retour derreur..
    Par kiza dans le forum Langage
    Réponses: 7
    Dernier message: 02/12/2005, 15h36
  2. Deformer une Police dans un Canvas
    Par zarbydigital dans le forum Langage
    Réponses: 2
    Dernier message: 10/11/2005, 10h51
  3. ecrire dans un fichier un retour a la ligne
    Par ETI-trian dans le forum C++
    Réponses: 8
    Dernier message: 17/10/2005, 09h51
  4. rotations dans l'espace -validation d'un modèle mathématique
    Par khayyam90 dans le forum Mathématiques
    Réponses: 20
    Dernier message: 16/08/2005, 13h26

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