Python - 移动对象\标签\按钮并更改其属性

0 投票
1 回答
9381 浏览
提问于 2025-04-17 16:13

我正在学习Python,这本教我Python的书给了我两种用tkinter创建标签的方法:

self.canvas.create_text(30,10,text="Welcome",tags="text")

&

self.lbl = Label(frame1, text = "Welcome")

在第一个例子中,移动标签很简单:

self.canvas.move("text", 1, 0)

在第二个例子中,改变它的背景颜色也很简单:

self.lbl["bg"] = "red"

但是我不知道怎么在这两个例子中同时移动标签和改变它的背景颜色,至少我不知道怎么逐步移动它。我可以这样做:

 self.lbl.place(x=2)

但如果我不能提前知道x坐标,我就只能移动一次。我可以提前设置这个坐标,但如果可以的话,我想避免这样做。

1 个回答

4

有几种方法可以做到这两点。

首先,Canvas 上的文字是没有背景的,但你可以用一个矩形来自己创建一个背景。

text = self.canvas.create_text(30, 10, text="Welcome", tags="text")
# The canvas.bbox method returns the corner coordinates of the provided item id.
rect = self.canvas.create_rectangle(self.canvas.bbox(text), fill='red')
# Then you need to reposition the rectangle so that it is behind the text.
self.canvas.lower(rect, text)

然后,你可以像你在问题中提到的那样移动它们。给文字和矩形都加上一个组标签,这样你就不用分别移动这两个东西了。

其次,你可以通过 .winfo_x().winfo_y() 方法获取一个小部件的当前 x 和 y 坐标。所以移动 Label 就变得很简单,只需要加减坐标就行:

self.lbl.place(x=self.lbl.winfo_x()+2)

我不知道有没有方法可以像在画布上那样按增量移动小部件。

至于哪个更好,我想不出太多区别。我觉得使用 Canvas 的话,就不能和窗口里的其他小部件重叠,因为文字会滚动出视野。如果你开始使用 ttk 版本的 Label,那么样式设置就没那么简单了,不过也不是特别难。

撰写回答