首页 > 解决方案 > 将 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。我不能这样做,因为我的程序中的形状数量庞大,这需要很长时间将它们全部重写为变量,并会导致程序中其他函数出现许多其他问题),因为我的程序有太多这些形状,我无法重写并将它们的每个坐标更改为分配的值。我必须使用移动函数,因为坐标最终会调整我的对象的大小(尽管如果有人也知道解决这个问题的方法,那就太好了)。非常感谢您阅读所有这些内容,过去几个小时我一直在研究并试图解决这个问题,但一无所获。

标签: pythontkinter

解决方案


随着运动,事情变得复杂,但您可能会对拖放项目感到满意。这可以通过这里的代码进行:

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()

推荐阅读