Se connecter / S'enregistrer
Votre question

[Python] Récupérer une valeur d'un rectangle dans Tkinter

Tags :
  • Dessin
  • Python
  • Programmation
Dernière réponse : dans Programmation
16 Juillet 2009 13:48:11

Bonjour, j'ai récupéré ce petit bout de code dans un guide:

  1. def mouseDown(self, event):
  2. "Op. à effectuer quand le bouton gauche de la souris est enfoncé"
  3. if self.snap:
  4. self.currObject =None
  5. # event.x et event.y contiennent les coordonnées du clic effectué :
  6. self.x1, self.y1 = event.x, event.y
  7. # <find_closest> renvoie la référence du dessin le plus proche :
  8. self.selObject = self.can1.find_closest(self.x1, self.y1)
  9. # modification de l'épaisseur du contour du dessin :
  10. self.can1.itemconfig(self.selObject, width =3)
  11. # <lift> fait passer le dessin à l'avant-plan :
  12. self.can1.lift(self.selObject)
  13. 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.







  1. # -*- coding: cp1252 -*-
  2.  
  3. "Création de prisme de pression avec trappes"
  4.  
  5. # Importation des modules externes
  6.  
  7. from Tkinter import *
  8.  
  9. # Importation module interne
  10.  
  11.  
  12.  
  13. class ModPrism(Frame):
  14.  
  15. def __init__(self, boss=None, hauteur=700, largeur=1000):
  16.  
  17. Frame.__init__(self,borderwidth = 0)
  18.  
  19. self.boss = boss
  20. self.h = hauteur
  21. self.w = largeur
  22. self.flw = float(self.w - 320)
  23. self.flh = float(self.h - 20)
  24.  
  25. self.can1 = Canvas(self,bg='white',height=self.h,width=self.w-300)
  26. self.can2 = Canvas(self,bg='white',height=self.h,width=300)
  27. self.can1.grid(row=0,column=0)
  28. self.can2.grid(row=0,column=1)
  29. self.can1.grid_propagate(False)
  30. self.can2.grid_propagate(False)
  31.  
  32. self.can1.bind("<Button-1>", self.mouseDown)
  33. self.can1.bind("<Button1-Motion>", self.mouseMove)
  34.  
  35. self.lab00 = Frame(self.can2,bg="white")
  36. self.lab00.grid(column=0,row=0,padx=5,pady=5)
  37.  
  38. self.weNbCasesLg=Entry(self.lab00)
  39. self.weNbCasesHt=Entry(self.lab00)
  40.  
  41. Label(self.lab00,text="Nombres de Colones",bg="white").grid(
  42. column=0,row=0)
  43. Label(self.lab00,text="Nombres de Rangées",bg="white").grid(
  44. column=0,row=1)
  45. self.weNbCasesLg.grid(column=1,row=0)
  46. self.weNbCasesHt.grid(column=1,row=1)
  47.  
  48. a=Button(self.can2,text='Lancement',command=self.activation)
  49. a.grid(column=0,row=2)
  50.  
  51. def activation(self):
  52.  
  53. self.snap = 1
  54.  
  55. self.can1.delete(ALL)
  56.  
  57. self.nbCasesLg = int(self.weNbCasesLg.get())
  58. self.nbCasesHt = int(self.weNbCasesHt.get())
  59.  
  60. nbNoeudsTotaux = (self.nbCasesLg+1)*(self.nbCasesHt+1)
  61.  
  62. intervaleHt = self.flh/self.nbCasesHt
  63. intervaleLg = self.flw/self.nbCasesLg
  64.  
  65. self.points = [0]*nbNoeudsTotaux
  66. self.pointsX = []
  67. self.pointsY = []
  68.  
  69. for i in range(self.nbCasesHt+1):
  70. self.can1.create_line(10,i*intervaleHt+10,self.flw+10,
  71. i*intervaleHt+10)
  72.  
  73. for i in range(self.nbCasesLg+1):
  74. self.can1.create_line(i*intervaleLg+10,10,i*intervaleLg+10,
  75. self.flh+10)
  76.  
  77.  
  78. for i in range(self.nbCasesLg+1):
  79. for j in range(self.nbCasesHt+1):
  80. self.points[i*self.nbCasesLg+j] = self.can1.create_rectangle(i*
  81. intervaleLg+7,j*intervaleHt+7,i*
  82. intervaleLg+13,j*intervaleHt+13,
  83. fill="blue")
  84.  
  85. def mouseDown(self, event):
  86. "Op. à effectuer quand le bouton gauche de la souris est enfoncé"
  87. if self.snap:
  88. self.currObject =None
  89. # event.x et event.y contiennent les coordonnées du clic effectué :
  90. self.x1, self.y1 = event.x, event.y
  91. # <find_closest> renvoie la référence du dessin le plus proche :
  92. self.selObject = self.can1.find_closest(self.x1, self.y1)
  93. # modification de l'épaisseur du contour du dessin :
  94. self.can1.itemconfig(self.selObject, width =3)
  95. # <lift> fait passer le dessin à l'avant-plan :
  96. self.can1.lift(self.selObject)
  97. print self.selObject
  98.  
  99.  
  100.  
  101.  
  102.  
  103. if __name__ == '__main__':
  104.  
  105. root = Tk()
  106.  
  107. ecran = ModPrism(root)
  108. ecran.grid()
  109.  
  110. root.mainloop()




Autres pages sur : python recuperer valeur rectangle tkinter

16 Juillet 2009 16:59:37

À 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 :ange: 
Contenus similaires
16 Juillet 2009 20:28:53

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.

16 Juillet 2009 22:40:23

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 :) 
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS