如何在 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()
是相对于之前的位置,你需要更新之前的位置(startX
和startY
):
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))
我在 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()
是相对于之前的位置,你需要更新之前的位置(startX
和startY
):
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))