J'ai créé un programme glisser-déposer qui fonctionne bien avec un petit problème esthétique. Cela fonctionne en sélectionnant un élément dans une zone de liste, en le convertissant en canvas.create_text, puis en le déposant sur le canevas. Le seul problème est que le create_text est sous la liste, et je me demandais comment le faire apparaître en haut de la liste. J'ai essayé de changer l'ordre d'initialisation, et j'ai regardé augmenter/diminuer, mais je n'ai vu aucun changement.tkinter canvas over frame
def body(self, master):
self.list = Listbox(master, width=26, height=10)
self.list.grid(row=0, column=1)
self.canvas = Canvas(master, width=350, height=500)
self.canvas.grid(row=0, column=0)
for j in self.items:
self.list.insert(END, j)
self.list.bind("<ButtonPress-1>", self.onPress)
self.list.bind("<ButtonRelease-1>", self.onRelease)
self.list.bind("<B1-Motion>", self.onMotion)
def onPress(self, event):
'''Being drag of an object'''
# record the item and its location
w = event.widget
index = w.nearest(event.y)
name = self.list.get(index)
t = self.canvas.create_text(event.x+350, event.y+90, text=name.replace(' ', '\n'),justify=CENTER, tags='sweden')
self.dragData["item"] = t
self.dragData["x"] = event.x
self.dragData["y"] = event.y
self.list.delete(index)
def onMotion(self, event):
'''Handle dragging of an object'''
# compute how much this object has moved
deltaX = event.x - self.dragData["x"]
deltaY = event.y - self.dragData["y"]
# move the object the appropriate amount
self.canvas.move(self.dragData["item"], deltaX, deltaY)
# record the new position
self.dragData["x"] = event.x
self.dragData["y"] = event.y
def onRelease(self, event):
'''End drag of an object'''
# reset the drag information
wx, wy = self.canvas.winfo_rootx(), self.canvas.winfo_rooty()
x,y = self.winfo_pointerxy()
cx = self.canvas.canvasx(x-wx)
cy = self.canvas.canvasy(y-wy)
#Rest of the release code
Je ne comprends pas ce que "le texte de création est sous la liste" signifie. Comment peut-il être sous la zone de liste lorsque la zone de liste et le canevas sont dans deux parties séparées de la fenêtre qui ne se chevauchent pas? –
Lorsque je clique sur un élément de la liste, un create_text est créé à l'emplacement de la souris (dans la zone de liste), mais la zone de liste est au-dessus. J'essaie de le configurer de telle sorte que lorsque le create_text est créé, il apparaît en haut de la liste –