Je travaille sur une application qui nécessite le repositionnement des éléments du canevas. J'ai développé la classe grabbablePoint suivante mais les nouveaux points ne sont pas CURRENT à moins que je ne déplace la souris hors du point et ensuite de nouveau sur le point.
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
class grabbablePoint:
def __init__(self, canvas, x, y, r):
if not(canvas.find_withtag(tk.CURRENT)):
h = canvas.create_oval(x-r, y-r, x+r, y+r)
canvas.tag_bind(h, '<Enter>', lambda e,hh=h: canvas.itemconfig(hh,fill='#FF0000'))
canvas.tag_bind(h, '<Leave>', lambda e,hh=h: canvas.itemconfig(hh,fill=''))
canvas.tag_bind(h, '<B1-Motion>', lambda e,hh=h: canvas.coords(hh,e.x-r,e.y-r,e.x+r,e.y+r))
if __name__ == '__main__':
canv = tk.Canvas(width=400, height=300, bg='#CCCCFF')
canv.bind('<Button-1>',lambda e: grabbablePoint(canv,e.x,e.y,3))
canv.pack()
tk.mainloop()
Par conséquent, si je clique sur un point avant de me déplacer et de revenir en arrière, un autre point apparaît juste au-dessus du premier. Bizarrement, je peux remédier à ce comportement indésirable en ajoutant un attribut de remplissage à create_oval ...
h = canvas.create_oval(x-r, y-r, x+r, y+r, fill='#FF0000')
Maintenant, il fonctionne parfaitement. Quelqu'un peut-il m'expliquer ce qui se passe ici ? Pourquoi l'ajout d'un attribut déclenche-t-il CURRENT et pourquoi n'est-il pas défini autrement ?