[Python] Récupérer une valeur d'un rectangle dans Tkinter
Dernière réponse : dans Programmation
Bonjour, j'ai récupéré ce petit bout de code dans un guide:
Il permet, lorsque l'on clique dans un canvas avec des objets (rectangle, cercle, ligne), de sélectionner l'objet le plus près du clic de souris.
Maintenant, ce que j'essayais de faire, c'est de créer un quadrillage où l'on puisse cliquer avec un effet de snap (la souris se colle aux coordonnés ronds, en gros si on pointe sur 15.998 elle se collera sur 16. (Il existe des façon plus simple de faire un snapping, mais j'aimerais tester celle là)
Donc ayant fait un quadrillage, et placé un petit rectangle à chaque croisement de lignes, l'événement le plus proche représente le petit rectangle le plus proche (à moins que l'utilisateur ne clique délibérément sur une ligne, ce qui est un problème...). Maintenant l'objet self.selObject est un tupple représentant le numéro d'apparition du rectangle. Pas très pratique...
Est ce qu'il est possible d'aller chercher, disons les coordonnés bbox de l'événement associé au tupple self.selObject. Parce que self.selObject n'est pas le rectangle, mais qu'un numéro pointant vers ce rectangle.
Pour info, je laisse le code complet en dessous de mon message.
def mouseDown(self, event): "Op. à effectuer quand le bouton gauche de la souris est enfoncé" if self.snap: self.currObject =None # event.x et event.y contiennent les coordonnées du clic effectué : self.x1, self.y1 = event.x, event.y # <find_closest> renvoie la référence du dessin le plus proche : self.selObject = self.can1.find_closest(self.x1, self.y1) # modification de l'épaisseur du contour du dessin : self.can1.itemconfig(self.selObject, width =3) # <lift> fait passer le dessin à l'avant-plan : self.can1.lift(self.selObject) print self.selObject
Il permet, lorsque l'on clique dans un canvas avec des objets (rectangle, cercle, ligne), de sélectionner l'objet le plus près du clic de souris.
Maintenant, ce que j'essayais de faire, c'est de créer un quadrillage où l'on puisse cliquer avec un effet de snap (la souris se colle aux coordonnés ronds, en gros si on pointe sur 15.998 elle se collera sur 16. (Il existe des façon plus simple de faire un snapping, mais j'aimerais tester celle là)
Donc ayant fait un quadrillage, et placé un petit rectangle à chaque croisement de lignes, l'événement le plus proche représente le petit rectangle le plus proche (à moins que l'utilisateur ne clique délibérément sur une ligne, ce qui est un problème...). Maintenant l'objet self.selObject est un tupple représentant le numéro d'apparition du rectangle. Pas très pratique...
Est ce qu'il est possible d'aller chercher, disons les coordonnés bbox de l'événement associé au tupple self.selObject. Parce que self.selObject n'est pas le rectangle, mais qu'un numéro pointant vers ce rectangle.
Pour info, je laisse le code complet en dessous de mon message.
# -*- coding: cp1252 -*- "Création de prisme de pression avec trappes" # Importation des modules externes from Tkinter import * # Importation module interne class ModPrism(Frame): def __init__(self, boss=None, hauteur=700, largeur=1000): Frame.__init__(self,borderwidth = 0) self.boss = boss self.h = hauteur self.w = largeur self.flw = float(self.w - 320) self.flh = float(self.h - 20) self.can1 = Canvas(self,bg='white',height=self.h,width=self.w-300) self.can2 = Canvas(self,bg='white',height=self.h,width=300) self.can1.grid(row=0,column=0) self.can2.grid(row=0,column=1) self.can1.grid_propagate(False) self.can2.grid_propagate(False) self.can1.bind("<Button-1>", self.mouseDown) self.can1.bind("<Button1-Motion>", self.mouseMove) self.lab00 = Frame(self.can2,bg="white") self.lab00.grid(column=0,row=0,padx=5,pady=5) self.weNbCasesLg=Entry(self.lab00) self.weNbCasesHt=Entry(self.lab00) Label(self.lab00,text="Nombres de Colones",bg="white").grid( column=0,row=0) Label(self.lab00,text="Nombres de Rangées",bg="white").grid( column=0,row=1) self.weNbCasesLg.grid(column=1,row=0) self.weNbCasesHt.grid(column=1,row=1) a=Button(self.can2,text='Lancement',command=self.activation) a.grid(column=0,row=2) def activation(self): self.snap = 1 self.can1.delete(ALL) self.nbCasesLg = int(self.weNbCasesLg.get()) self.nbCasesHt = int(self.weNbCasesHt.get()) nbNoeudsTotaux = (self.nbCasesLg+1)*(self.nbCasesHt+1) intervaleHt = self.flh/self.nbCasesHt intervaleLg = self.flw/self.nbCasesLg self.points = [0]*nbNoeudsTotaux self.pointsX = [] self.pointsY = [] for i in range(self.nbCasesHt+1): self.can1.create_line(10,i*intervaleHt+10,self.flw+10, i*intervaleHt+10) for i in range(self.nbCasesLg+1): self.can1.create_line(i*intervaleLg+10,10,i*intervaleLg+10, self.flh+10) for i in range(self.nbCasesLg+1): for j in range(self.nbCasesHt+1): self.points[i*self.nbCasesLg+j] = self.can1.create_rectangle(i* intervaleLg+7,j*intervaleHt+7,i* intervaleLg+13,j*intervaleHt+13, fill="blue") def mouseDown(self, event): "Op. à effectuer quand le bouton gauche de la souris est enfoncé" if self.snap: self.currObject =None # event.x et event.y contiennent les coordonnées du clic effectué : self.x1, self.y1 = event.x, event.y # <find_closest> renvoie la référence du dessin le plus proche : self.selObject = self.can1.find_closest(self.x1, self.y1) # modification de l'épaisseur du contour du dessin : self.can1.itemconfig(self.selObject, width =3) # <lift> fait passer le dessin à l'avant-plan : self.can1.lift(self.selObject) print self.selObject if __name__ == '__main__': root = Tk() ecran = ModPrism(root) ecran.grid() root.mainloop()
Autres pages sur : python recuperer valeur rectangle tkinter
Lassé par la pub ? Créez un compte
À force de chercher, j'ai pu constater qu'on pouvait récupérer la valeur d'une propriété d'un objet Canvas à l'aide de
a = self.can1.itemcget(self.selObject, "fill")
Ce que je ne comprends toujours pas, c'est pourquoi l'option dont on cherche la valeur doit être en guillemet lorsque l'on utilise la méthode itemcget(item, option)
Edit: Et comment faire pour récupérer les coordonnés de l'item ? bbox ne fonctionne pas comme option
a = self.can1.itemcget(self.selObject, "fill")
Ce que je ne comprends toujours pas, c'est pourquoi l'option dont on cherche la valeur doit être en guillemet lorsque l'on utilise la méthode itemcget(item, option)
Edit: Et comment faire pour récupérer les coordonnés de l'item ? bbox ne fonctionne pas comme option
Les options sont entre guillemets, parce que derrière il y a un dictionnaire.
Pour changer les coordonées, ce n'est pas dans les options. Il faut utiliser coords(item, x0, y0, x1, y1)
http://www.pythonware.com/library/tkinter/introduction/canvas-rectangle.htm
Pour changer les coordonées, ce n'est pas dans les options. Il faut utiliser coords(item, x0, y0, x1, y1)
http://www.pythonware.com/library/tkinter/introduction/canvas-rectangle.htm
Merci CRicky.
Mais je ne veux pas les changer, ça je sais le faire. Je veux en fait les obtenir. En effet, comme j'essais de faire un effet de snapping (la souris colle sur les coordonnés précise), j'ai rempli mon canvas de petites zones (des rectangles) et je récupère la zone la plus proche du clic de la souris.
Cette zone (ce rectangle) est donc une façon de créer une zone dans laquelle les coordonnés du clic de la souris seront arrondis à une telle valeurs.
Maintenant que j'ai le numéro de l'objet rectangle le plus proche, je cherche à obtenir les coordonnés de ce rectangle. Ensuite il me sera facile d'assigner une valeur x et y "snappé" à mon clic.
Mais je ne veux pas les changer, ça je sais le faire. Je veux en fait les obtenir. En effet, comme j'essais de faire un effet de snapping (la souris colle sur les coordonnés précise), j'ai rempli mon canvas de petites zones (des rectangles) et je récupère la zone la plus proche du clic de la souris.
Cette zone (ce rectangle) est donc une façon de créer une zone dans laquelle les coordonnés du clic de la souris seront arrondis à une telle valeurs.
Maintenant que j'ai le numéro de l'objet rectangle le plus proche, je cherche à obtenir les coordonnés de ce rectangle. Ensuite il me sera facile d'assigner une valeur x et y "snappé" à mon clic.
OK. C'est presque pareil, sur le widget canvas, tu fais un coords(item) et ça te retourne la liste des coordonnées.
http://www.pythonware.com/library/tkinter/introduction/x2102-methods.htm
http://www.pythonware.com/library/tkinter/introduction/x2102-methods.htm
Merci beaucoup. Je croyais que cette méthode ne servait qu'à modifier les coordonnés, mais tu viens de m'apprendre qu'elle peut aussi retourner les coordonnés de l'item existant.
En relisant la référence, c'était bien marqué:
coords(item, *coords) [#]
Returns the coordinates for an item.
item
Item specifier (tag or id).
*coords
Optional list of coordinate pairs. If given, the coordinates will replace the current coordinates for all matching items.
Returns:
If no coordinates are given, this method returns the coordinates for the matching item. If the item specifier matches more than one item, the coordinates for the first item found is returned.
Merci encore
En relisant la référence, c'était bien marqué:
coords(item, *coords) [#]
Returns the coordinates for an item.
item
Item specifier (tag or id).
*coords
Optional list of coordinate pairs. If given, the coordinates will replace the current coordinates for all matching items.
Returns:
If no coordinates are given, this method returns the coordinates for the matching item. If the item specifier matches more than one item, the coordinates for the first item found is returned.
Merci encore
Lassé par la pub ? Créez un compte
- Contenus similaires :
- ForumRécupérer valeur dans une page html
- ForumRécupérer une valeur entrée par l'utilisateur dans un champ text c#
- ForumRécupérer valeur avec $_post
- ForumPython-->Comment additionner des valeurs d'une liste
- ForumRécupérer une valeur d'une autre page
- Forumjavascript : comment recupérer la valeur d'un prompt ?
- ForumRécupérer des valeurs de plusieurs listes déroulantes [Résolu]
- Forumphp récupération valeurs listes liées
- ForumPython--->Comment fait on pour copier des valeurs printer à l'écran
- Voir plus