Tkinter中的堆垛顺序维护

Tkinter中的堆垛顺序维护,tkinter,Tkinter,有没有一种方法可以在Tkinter中保持小部件(特别是图像)的一致堆叠顺序?例如,我可能有两个矩形、两个三角形和一个圆,它们都位于画布上的同一位置。圆圈移动到上次单击鼠标的位置,但我始终希望它绘制在矩形顶部和三角形后面。默认行为当然是将最后绘制的对象放置在顶部的给定位置 到目前为止,我只找到了lift()和lower()方法来解决Tkinter中的堆栈问题。理论上,我可以在每次重新绘制时进行一些杂乱的检查,以查看目的地是否存在三角形,并对每个形状进行提升()/降低(),直到事情符合我的要求,但这

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

到目前为止,我只找到了lift()和lower()方法来解决Tkinter中的堆栈问题。理论上,我可以在每次重新绘制时进行一些杂乱的检查,以查看目的地是否存在三角形,并对每个形状进行提升()/降低(),直到事情符合我的要求,但这似乎是一个荒谬的解决方案。我希望画布对象上会有一种“layer”变量,这样它就会被动地记住第3层的项目应该总是在第1层的项目后面

我很抱歉,如果有一个简单的方法来解决我的问题,但到目前为止,我所有的搜索都没有结果。我将感谢任何意见

用“三角形”标记所有三角形,用“矩形”标记所有矩形,用“圆”标记所有圆。然后,您可以使用
lift
lower
方法一次升高或降低所有三角形、圆或矩形。它只需要几句话,即使你有数千件物品,也会在不到一眨眼的时间内发生

既然您询问了内置的层机制:tk没有这样的东西,但它很容易添加,所有的工具都在那里。因此,不要将
lift
lower
命令洒到任何地方,而是让所有的图形都通过一个特殊的命令来处理分层

例如,下面是一个命令示例,该命令接受图层号并确保其绘制的所有内容都位于该图层上:

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%正确,但我认为它说明了这一点)


其基本思想是,所有对象的创建都通过一个单独的功能进行,该功能可以在每次创建项目时调整堆叠顺序。这样,您只需在一个位置添加这些提升/降低命令

谢谢你,布莱恩。我希望我不必在我的代码中分散这些语句,但似乎没有更简单的方法。我感谢你的帮助@Taugosz:我更新了我的答案,以展示如何拥有实现分层系统所需的一切。没有内置的功能,但实现自己的分层只需要一点点想象力;我确实有我需要的工具。我非常感谢您花时间编写了如此完整的代码来说明您的观点。