动图动全Canvas
Moving image moves the whole Canvas
我正在 Tkinter 上创建一个需要拖放图像的应用程序。问题是当图像被移动时,整个 canvas 都被移动了。为什么会发生这种情况,如何解决?
代码
from tkinter import *
import os
root = Tk()
root.geometry("500x500")
mycanvas = Canvas(root, bg = 'red')
mycanvas.pack()
def cargarimg(archivo): # Se carga imagen
ruta = os.path.join('img', archivo)
imagen = PhotoImage(file = ruta)
return imagen
photo = cargarimg("Res.png")
a = mycanvas.create_image(100, 100, image = photo)
def drag_start(event):
widget = event.widget
widget.startX = event.x
widget.startY = event.y
def drag_motion(event):
widget = event.widget
x = widget.winfo_x() - widget.startX + event.x
y = widget.winfo_y() - widget.startY + event.y
widget.place(x=x,y=y)
mycanvas.tag_bind(a, '<Button-1>', drag_start)
mycanvas.tag_bind(a, '<B1-Motion>', drag_motion)
root.mainloop()
这是因为 event.widget
是 canvas,而不是图像项 a
。
您需要使用 canvas 的方法 move()
或 moveto()
来移动图像项。下面是 drag_motion()
使用 move()
更新的:
def drag_motion(event):
widget = event.widget
dx, dy = event.x-widget.startX, event.y-widget.startY
event.widget.move(a, dx, dy)
widget.startX, widget.startY = event.x, event.y
我正在 Tkinter 上创建一个需要拖放图像的应用程序。问题是当图像被移动时,整个 canvas 都被移动了。为什么会发生这种情况,如何解决?
代码
from tkinter import *
import os
root = Tk()
root.geometry("500x500")
mycanvas = Canvas(root, bg = 'red')
mycanvas.pack()
def cargarimg(archivo): # Se carga imagen
ruta = os.path.join('img', archivo)
imagen = PhotoImage(file = ruta)
return imagen
photo = cargarimg("Res.png")
a = mycanvas.create_image(100, 100, image = photo)
def drag_start(event):
widget = event.widget
widget.startX = event.x
widget.startY = event.y
def drag_motion(event):
widget = event.widget
x = widget.winfo_x() - widget.startX + event.x
y = widget.winfo_y() - widget.startY + event.y
widget.place(x=x,y=y)
mycanvas.tag_bind(a, '<Button-1>', drag_start)
mycanvas.tag_bind(a, '<B1-Motion>', drag_motion)
root.mainloop()
这是因为 event.widget
是 canvas,而不是图像项 a
。
您需要使用 canvas 的方法 move()
或 moveto()
来移动图像项。下面是 drag_motion()
使用 move()
更新的:
def drag_motion(event):
widget = event.widget
dx, dy = event.x-widget.startX, event.y-widget.startY
event.widget.move(a, dx, dy)
widget.startX, widget.startY = event.x, event.y