如何在 Tkinter 中移动 canvas 内的文本

How to move text inside canvas in Tkinter

我在 canvas 内移动关于鼠标光标的文本时遇到问题。

用鼠标按钮 1 单击文本,然后拖动鼠标时,整个 canvas 被移动而不是里面的文本

我应该怎么做才能纠正这个问题?

这是我的代码:

from tkinter import* 
import tkinter as tk 

root = Tk()   
root.geometry('1000x600+500+100')
root.resizable(False,False)

def drag_start(event):
    widget = event.widget
    widget.startX = event.x
    widget.startY = event.y

def mov(event):
    widget = event.widget
    x = widget.winfo_x() - widget.startX + event.x
    y = widget.winfo_y() - widget.startY + event.y
    canvas.move(obj,x,y)
    canvas.update()

canvas=Canvas(root,width=
800,height=600,bg="red")

canvas.pack(fill=BOTH,
expand=1)

obj=canvas.create_text(100,
50,text="Object",fill=
'blue',font=('Gotham Medium',30,"bold"),anchor="nw")

canvas.tag_bind(obj,"<Button-1>",drag_start)
canvas.tag_bind(obj,'<B1-Motion>',mov)

root.mainloop()

mov()函数中只有一个小错误。一旦文本移动了一点,您需要更新 X 和 Y 的起始位置。否则,它将始终相对于第一个位置移动并以指数方式增加速度,直到它超出 canvas.

def mov(event):
    widget = event.widget
    x = widget.winfo_x() - widget.startX + event.x
    y = widget.winfo_y() - widget.startY + event.y
    canvas.move(obj,x,y)
    widget.startX = event.x
    widget.startY = event.y
    canvas.update()

这应该可以解决问题,您可以移动文本。

由于canvas.move()是相对于之前的位置,你需要更新之前的位置(startXstartY):

def drag_start(event):
    widget = event.widget
    widget.startX, widget.startY = event.x, event.y

def mov(event):
    widget = event.widget
    widget.move(obj, event.x-widget.startX, event.y-widget.startY)
    widget.startX, widget.startY = event.x, event.y # update previous position

或使用canvas.coords():

def drag_start(event):
    widget = event.widget
    x, y = widget.coords(obj)
    # save the offset of the click position from the obj's top-left corner
    widget.dx, widget.dy = event.x-x, event.y-y

def mov(event):
    widget = event.widget
    widget.coords(obj, (event.x-widget.dx, event.y-widget.dy))