python - 将 tkinter 画布形状放在光标位置
问题描述
我知道有多个类似的帖子,但我遇到的问题非常独特。
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 行时,它通过 ex 和 ey 移动对象(例如,如果鼠标位于 342、563 上,它会将正方形移动那么多)。我可以让它将正方形移动到那些坐标,而不是按该值添加当前坐标。如果您想知道,我不能使用 canvas.coords 或为我的形状分配新坐标或变量(比如不是 10,而是 x1。我不能这样做,因为我的程序中的形状数量庞大,这需要很长时间将它们全部重写为变量,并会导致程序中其他函数出现许多其他问题),因为我的程序有太多这些形状,我无法重写并将它们的每个坐标更改为分配的值。我必须使用移动函数,因为坐标最终会调整我的对象的大小(尽管如果有人也知道解决这个问题的方法,那就太好了)。非常感谢您阅读所有这些内容,过去几个小时我一直在研究并试图解决这个问题,但一无所获。
解决方案
随着运动,事情变得复杂,但您可能会对拖放项目感到满意。这可以通过这里的代码进行:
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()
您应该知道move 需要 values 而不是 coords。因此,如果您编写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()
推荐阅读
- r - 为什么我的 while 循环不能正常工作?
- html - 如何根据我的代码从 jsp 页面获取 Servlet 页面中的多个选中单选按钮?
- python - Dask 线程调度程序调试技巧
- python - 在 Python 上读取 .cdb 数据集
- time-complexity - 如何比较时间复杂度 O(n^2) 和 O(N+log(M))?
- python - 使用 Pandas 在 groupby DataFrame 中标记更改列
- javascript - 如何用元素宽度替换 URL 参数
- asp.net - 查看 VS 2017 中最后一次成功构建的代码
- mysql - 使用“replace into”语句时,唯一键发生MySQL死锁
- c# - 将 Picturebox 图像的一部分保存在 Jpg 文件中