tkinter - Tkinter 中的堆叠顺序维护

标签 tkinter

有没有办法在 Tkinter 中保持小部件(特别是图像)的堆叠顺序一致?例如,我可能在 Canvas 上的同一位置有两个矩形、两个三角形和一个圆。圆圈移动到最后一次点击鼠标的地方,但我总是希望它被绘制在矩形的顶部和三角形的后面。默认行为当然是将最后绘制的对象放在顶部的给定位置。

到目前为止,我只找到了 Lift() 和 lower() 方法来解决 Tkinter 中的堆叠问题。理论上,我可以在每次重新绘制时进行一些凌乱的检查,以查看目标处是否存在三角形,并对那里的每个形状进行一些提升()/降低(),直到事情达到我想要的方式为止,但这似乎是一个荒谬的解决方案。我希望在 Canvas 对象上有一种“层”变量,因此它会被动地记住第 3 层的项目应该始终位于第 1 层的项目之后。

如果有一种简单的方法可以解决我的问题,我深表歉意,但到目前为止,我的所有搜索都无济于事。我将不胜感激任何输入!

最佳答案

用“triangle”标记所有三角形,用“rectangle”标记所有矩形,用“circle”标记所有圆形。然后您可以使用 liftlower一次升高或降低所有三角形、圆形或矩形的方法。它只需要几个语句,即使您有数千个项目,它也会在眨眼之间发生。
既然你问到内置层机制:tk 没有这样的东西,但它真的很容易添加,所有工具都在那里。所以,而不是洒 liftlower命令无处不在,让您的所有绘图都通过一个特殊的命令来处理您的分层。
例如,下面是一个命令示例,它接受一个图层编号并确保它绘制的所有内容都在该图层上:

def add_to_layer(self, layer, command, coords, **kwargs):
    layer_tag = "layer %s" % layer
    if layer_tag not in self._layers: self._layers.append(layer_tag)
    tags = kwargs.setdefault("tags", [])
    tags.append(layer_tag)
    item_id = command(coords, **kwargs)
    self._adjust_layers()
    return item_id

def _adjust_layers(self):
    for layer in sorted(self._layers):
        self.canvas.lift(layer)
然后你会这样称呼它:
# draw a circle on layer 1:
self.add_to_layer(1, self.canvas.create_oval, (x0,y0,x1,y1), outline="red")
# draw a square on layer 2:
self.add_to_layer(2, self.canvas.create_rectangle, (x0,y0,x1,y1), fill="blue")
有很多其他方法可以完成同样的事情,以上只是我头脑中一个快速而肮脏的例子(并不能保证 100% 正确,但我认为它说明了这一点)。
基本思想是所有对象的创建都通过一个函数,该函数可以在每次创建项目时调整堆叠顺序。这样你只需在一个地方添加那些提升/降低命令。

关于tkinter - Tkinter 中的堆叠顺序维护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9576063/

相关文章:

python - 检查之后是否有 Tkinter 安排的方法

python - ttk 标签小部件中的多个图像

Python:tkinter 上的 Z-index

python - 如何在 Tkinter 中制作非方形边缘?

python - 更改 tkinter 菜单的字体

Python tkinter : How can I ensure only ONE child window is created onclick and not a new window every time the button is clicked?

python - 使用 Python 创建可直接执行的跨平台 GUI 应用程序

Python:将标签重置为零的按钮

python - 如何使用 Python 中的 Tkinter 检查当前是否按下了某个键?

python - 在 python 2.7 上导入 tkinter 时出现问题