如何设置 Python tkinter 画布元素的 z 索引?

Posted

技术标签:

【中文标题】如何设置 Python tkinter 画布元素的 z 索引?【英文标题】:How do I set the z index of an Python tkinter canvas element? 【发布时间】:2020-07-07 09:42:03 【问题描述】:

如何在画布初始启动时设置 tkinter 画布元素(圆形、矩形)的 z-index?或者我可以在绘图时直接设置 z-index,例如一个圆圈?不幸的是,我对canvas.tag_lower("tag_name") 无能为力。我认为这个命令会将标签的所有元素向后移动一级 - 是这样吗?

class CanvasGui(tk.Canvas):

    def __init__(self, master):
        super().__init__(master, bg="#FFF", highlightthickness=0, borderwidth=0)
        self.pack(fill="both", expand=True)
        self.setCanvasLayers()

    def setCanvasLayers(self):
        self.tag_lower("highlightGridPoint")
        self.tag_lower("grid")

在我看来,带有标签“highlightGridPoint”的元素现在应该在最远的背景中,带有标签“网格”的元素在前景中。但是如果我运行程序,就不是这样了……

【问题讨论】:

你怎么知道这不起作用?您尚未在画布上创建任何项目。 【参考方案1】:

在创建标签之前,您无法设置标签的顺序。您的代码升高和降低尚不存在的标记。

您可以通过注意此代码之间的行为差​​异来了解这一点:

canvas.setCanvasLayers()
canvas.create_rectangle(10,10,50,50, fill="red", tags=("red",))
canvas.create_rectangle(20,20,60,60, fill="green", tags=("green",))

...而这段代码:

canvas.create_rectangle(10,10,50,50, fill="red", tags=("red",))
canvas.create_rectangle(20,20,60,60, fill="green", tags=("green",))
canvas.setCanvasLayers()

【讨论】:

感谢您的回答!我是否能够更改标签的图层而不将其推到背景或前景,只需向上或向下一层?

以上是关于如何设置 Python tkinter 画布元素的 z 索引?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PYTHON 的“tkinter”模块在画布上显示图像,特别适用于 linux?

Python Tkinter:如何让画布每帧更新多边形坐标? [解决了]

在 Tkinter Python 中创建全局画布

删除 tkinter 画布上的所有元素并重新绘制,还是使用 move 更新元素?

Python Tkinter - 保存画布 - tkinter 崩溃

Python Tkinter刷新画布