将tkinter画布形状放置到光标位置

时间:2020-07-25 19:33:56

标签: 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行将对象移动e.x和e.y(例如,如果鼠标位于342、563上方,它将移动正方形那么多)。我可以这样做,以便将正方形移至那些坐标,而不是通过该值添加当前坐标。如果您想知道,我将无法使用canvas.coords或使用新坐标或变量来分配形状(例如代替x而不是10,它是x1。由于我的程序中存在大量的形状,因此我无法执行此操作会花费很多时间会将它们全部重写为变量,并且会导致程序中其他函数的其他许多问题),因为我的程序中有太多这些形状,无法重写并将它们的每个坐标更改为指定的值。我必须使用move函数,因为坐标最终会调整我的对象的大小(尽管如果有人也知道解决这个问题的方法,那会很棒)。非常感谢您阅读所有这些内容,在过去的几个小时中,我一直在研究和尝试解决此问题,但没有发现任何问题。

1 个答案:

答案 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()
相关问题