我知道有很多类似的帖子,但是我遇到的问题非常独特。
app = tk.TK()
canvas = tk.Canvas(app, width = 600, height = 600)
canvas.pack()
ObjectR = canvas.create_rectangle(10, 200, 50, 200, tag = 'Cursor Location', fill = 'green')
def keyinput(event):
#e.x
#e.y
canvas.move(ObjectR, e.x, e.y)
app.bind('<B1-Motion>', keyinput)
app.mainloop()
上面的程序创建一个矩形,然后根据鼠标悬停的像素移动该矩形。问题在于,canvas.move行将对象移动e.x和e.y(例如,如果鼠标位于342、563上方,它将移动正方形那么多)。我可以这样做,以便将正方形移至那些坐标,而不是通过该值添加当前坐标。如果您想知道,我将无法使用canvas.coords或使用新坐标或变量来分配形状(例如代替x而不是10,它是x1。由于我的程序中存在大量的形状,因此我无法执行此操作会花费很多时间会将它们全部重写为变量,并且会导致程序中其他函数的其他许多问题),因为我的程序中有太多这些形状,无法重写并将它们的每个坐标更改为指定的值。我必须使用move函数,因为坐标最终会调整我的对象的大小(尽管如果有人也知道解决这个问题的方法,那会很棒)。非常感谢您阅读所有这些内容,在过去的几个小时中,我一直在研究和尝试解决此问题,但没有发现任何问题。
答案 0 :(得分:1)
随着运动的进行,事情变得复杂了,但是您可能会很高兴拖曳一滴物品。可以通过此代码在这里完成:
import tkinter as tk
app = tk.Tk()
canvas = tk.Canvas(app, width = 600, height = 600)
canvas.pack()
ObjectR = canvas.create_rectangle(10, 200, 50, 200, tag = 'Cursor Location', fill = 'green')
start_coords=[]
def keyinput(e):
startx = e.x
starty = e.y
start_coords.append(startx)
start_coords.append(starty)
def move_it(e):
x = e.x-start_coords[0]
y = e.y-start_coords[1]
canvas.move(ObjectR, x, y)
start_coords.clear()
canvas.bind('<Button-1>', keyinput)
canvas.bind('<ButtonRelease>', move_it)
app.mainloop()
您应该注意,移动具有价值而非协调性。因此,如果您写canvas.move(item, 10,0)
,则项目在x轴上移动10个像素。因此,我以起点为起点,然后通过释放来计算将零件移至该点的差值。
让我知道是否不清楚。
我能想到的最稳定的版本是:
import tkinter as tk
app = tk.Tk()
canvas = tk.Canvas(app, width = 600, height = 600)
canvas.pack()
ObjectR = canvas.create_rectangle(10, 200, 50, 200, tag = 'Cursor Location', fill = 'green')
start_coords=[]
check = tk.IntVar()
check.set(0)
def keyinput(e):
startx = e.x
starty = e.y
if check.get() == 0:
start_coords.clear()
start_coords.append(startx)
start_coords.append(starty)
check.set(1)
return(start_coords)
else:
check.set(0)
return(start_coords)
def move_it(e):
x1,y1 = keyinput(e)
x = e.x-x1
y = e.y-y1
x = x*2
y = y*2
canvas.move(ObjectR, x, y)
def stop(e):
start_coords.clear()
check.set(0)
canvas.bind('<B1-Motion>',move_it)
canvas.bind('<ButtonRelease>', stop)
app.mainloop()