我有许多重叠的形状,代表画布上不相关的背景项。我也有一个非重叠圆圈的图案,每个圆圈都是一个“洞”。每个“洞”精灵(圆圈)都有一个相关的“洞”对象,尽管代码中没有明确说明。 (旁注:我希望模型和视图之间有这些对象的逻辑关联,但还没有找到一种聪明的方法来做到这一点)。每个“洞”都是不同的,并且有不同的效果。
有一个小的圆形“球”,可以拖入任何“洞”。我找到了如何从this question拖放。我需要找到球进入的洞。
到目前为止,我发现这样做的最好方法是:
创建一个dict,将孔精灵中心的坐标映射到孔对象
标记每个洞,如下所示:
t=("hole", "hole_at_{}_{}".format(x, y))
,请执行以下操作:
def on_ball_release(self,event): '''当用户释放鼠标握球时处理按钮事件。'''
# use small invisible rectangle and find all overlapping items
items = self._canvas.find_overlapping(event.x - 10, event.y - 10, event.x + 10, event.y + 10)
for item in items:
# there should only be 1 overlapping hole
if "hole" in self._canvas.gettags(item):
# get the coordinates from the tag
coords = tuple([int(i) for i in self._canvas.gettags(item)[1].replace("hole_at_", "").split("_")])
# get associated object using dictionary established before
hole = self._hole_dict[coords]
hole.process_ball()
return
这看起来非常混乱。我觉得应该有一些更聪明的方法来做到这一点。
答案 0 :(得分:1)
免责声明:我不使用Python,但许多Tkinter问题可以通过Tcl / Tk的经验来解答,我有。在这种情况下,需要做更多工作才能弄清楚我在Tcl中做什么很容易用Tkinter表示。
首先,我不会添加“标识符标签”(hole_at_...
):如果我有与画布项对应的模型对象,我会使用项目 id (画布返回期间)项目创建)作为索引,能够在不解析标签的情况下查找项目ID的对象。 (如果我必须添加字符串标识符,即使我决定从坐标中创建它们,我也会使用非常字符串作为我的字典键,以避免重新分析它。我们以后需要坐标吗?那么使它们成为hole
对象的属性。
其次,我会使用pathName find
子命令和多个条件来查找(画布ID)项目,该项目被标记为hole
并且是最接近给定点(overlapping
,当我们想要忽略距离任何一个洞太远的距离时,closest
适用于应该使用最近的洞的情况,即使它不太靠近)。这是有问题的部分:Tkinter是否支持画布'$pathName find
?