Tkinter中的堆垛顺序维护
有没有一种方法可以在Tkinter中保持小部件(特别是图像)的一致堆叠顺序?例如,我可能有两个矩形、两个三角形和一个圆,它们都位于画布上的同一位置。圆圈移动到上次单击鼠标的位置,但我始终希望它绘制在矩形顶部和三角形后面。默认行为当然是将最后绘制的对象放置在顶部的给定位置 到目前为止,我只找到了lift()和lower()方法来解决Tkinter中的堆栈问题。理论上,我可以在每次重新绘制时进行一些杂乱的检查,以查看目的地是否存在三角形,并对每个形状进行提升()/降低(),直到事情符合我的要求,但这似乎是一个荒谬的解决方案。我希望画布对象上会有一种“layer”变量,这样它就会被动地记住第3层的项目应该总是在第1层的项目后面 我很抱歉,如果有一个简单的方法来解决我的问题,但到目前为止,我所有的搜索都没有结果。我将感谢任何意见 用“三角形”标记所有三角形,用“矩形”标记所有矩形,用“圆”标记所有圆。然后,您可以使用Tkinter中的堆垛顺序维护,tkinter,Tkinter,有没有一种方法可以在Tkinter中保持小部件(特别是图像)的一致堆叠顺序?例如,我可能有两个矩形、两个三角形和一个圆,它们都位于画布上的同一位置。圆圈移动到上次单击鼠标的位置,但我始终希望它绘制在矩形顶部和三角形后面。默认行为当然是将最后绘制的对象放置在顶部的给定位置 到目前为止,我只找到了lift()和lower()方法来解决Tkinter中的堆栈问题。理论上,我可以在每次重新绘制时进行一些杂乱的检查,以查看目的地是否存在三角形,并对每个形状进行提升()/降低(),直到事情符合我的要求,但这
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:我更新了我的答案,以展示如何拥有实现分层系统所需的一切。没有内置的功能,但实现自己的分层只需要一点点想象力;我确实有我需要的工具。我非常感谢您花时间编写了如此完整的代码来说明您的观点。