识别在Tkinter中单击的模型对象

时间:2013-01-22 21:26:48

标签: python tkinter

我有许多重叠的形状,代表画布上不相关的背景项。我也有一个非重叠圆圈的图案,每个圆圈都是一个“洞”。每个“洞”精灵(圆圈)都有一个相关的“洞”对象,尽管代码中没有明确说明。 (旁注:我希望模型和视图之间有这些对象的逻辑关联,但还没有找到一种聪明的方法来做到这一点)。每个“洞”都是不同的,并且有不同的效果。

有一个小的圆形“球”,可以拖入任何“洞”。我找到了如何从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
    

这看起来非常混乱。我觉得应该有一些更聪明的方法来做到这一点。

1 个答案:

答案 0 :(得分:1)

免责声明:我不使用Python,但许多Tkinter问题可以通过Tcl / Tk的经验来解答,我有。在这种情况下,需要做更多工作才能弄清楚我在Tcl中做什么很容易用Tkinter表示。

首先,我不会添加“标识符标签”(hole_at_...):如果我有与画布项对应的模型对象,我会使用项目 id (画布返回期间)项目创建)作为索引,能够在不解析标签的情况下查找项目ID的对象。 (如果我必须添加字符串标识符,即使我决定从坐标中创建它们,我也会使用非常字符串作为我的字典键,以避免重新分析它。我们以后需要坐标吗?那么使它们成为hole对象的属性。

其次,我会使用pathName find子命令和多个条件来查找(画布ID)项目,该项目被标记为hole 并且是最接近给定点(overlapping,当我们想要忽略距离任何一个洞太远的距离时,closest适用于应该使用最近的洞的情况,即使它不太靠近)。这是有问题的部分:Tkinter是否支持画布'$pathName find

中的多个条件