使用Python在画布上移动小部件

时间:2019-11-30 08:12:20

标签: python canvas tkinter

这是关于使用tkinter在Python 3.7(我认为)中在画布上移动标签。

在Google和此站点上都有很多答案,但是没有一个答案能回答我的问题,但是我无法想象我的代码会更简单。在Python方面,我并没有经验丰富,而且显然我在做一些根本错误的事情。

我要执行的操作:将标签移动到画布上通过单击鼠标指示的位置。

我们在这里:

root = tk.Tk()
root.geometry("800x600")

def ClickedCallback(event):
    #print(f'Event: {event}, l2: {l2}, tags: {canvas.gettags()}')
    canvas.move(l2, 5, 0)

canvas = tk.Canvas(root, width=1000, height=600, bg='blue')
canvas.bind("<Button-1>", ClickedCallback)
canvas.place(relwidth=0.9, relheight=0.8, relx = 0.05, rely = 0.05)

l2 = tk.Label(canvas, bg='red')
l2.bind("<Button-1>", ClickedCallback)
l2.place(relx=0.2, rely=0.2)
l2['text'] = "Test"

root.mainloop()

现在会导致直线错误。 “第2591行,正在移动     self.tk.call((self._w,'move')+ args) _tkinter.TclError:标记搜索表达式中的布尔运算符无效”

然后,我看到了一个示例,该示例显示了输入到方法中的对象名称是字符串,而不是对象本身。这样一行就变成了:

canvas.move('l2', 5, 0)

现在这不会导致错误。但这也无能为力。

我什至不知道在画布上移动是否是执行此操作的最佳方法。我只想在窗口内移动标签,这似乎是出现在搜索中的标签。

1 个答案:

答案 0 :(得分:1)

要在Label上放置小部件(即Canvas),您必须使用

label_id = canvas.create_window(position, window=l2,...)

不是place() / grid() / pack()

然后您使用此label_id移动它。


简单示例-单击Label

Canvas被移动
import tkinter as tk

# --- functions ---

def clicked_callback(event):
    #canvas.move(label_id, 5, 0)
    canvas.coords(label_id, event.x, event.y)

# --- main ---

root = tk.Tk()
root.geometry("800x600")

canvas = tk.Canvas(root, width=1000, height=600, bg='blue')
canvas.bind("<Button-1>", clicked_callback)
canvas.place(relwidth=0.9, relheight=0.8, relx=0.05, rely=0.05)

l2 = tk.Label(canvas, text="Test", bg='red')
#l2.bind("<Button-1>", clicked_callback)
label_id = canvas.create_window((100, 100), window=l2)

root.mainloop()