0

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

有一个小的圆形“球”,可以拖入任何“洞”。我找到了如何从这个问题拖放。我需要找出球进了哪个洞。

到目前为止,我发现最好的方法是:

  • 创建一个字典,将孔精灵中心的坐标映射到孔对象

  • 像这样标记每个孔:

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
    

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

4

1 回答 1

1

免责声明:我不使用 Python,但许多 Tkinter 问题可以从我所拥有的 Tcl/Tk 经验中得到有用的回答。在这种情况下,需要做更多的工作来弄清楚我在 Tcl 中所做的事情是否易于用 Tkinter 表示。

hole_at_...首先,我不会添加“标识符标签(不解析标签的项目 ID。(如果我必须添加字符串标识符,即使我决定从坐标创建它们,我也会使用该字符串作为我的字典键,以避免重新解析它。我们以后需要坐标吗?然后将它们设为hole对象的属性) .

其次,我将使用pathName find具有多个标准的子命令来查找标记为hole 并且最接近给定点overlapping的项目(画布 ID)closest应该使用,即使它不是太近)。这是有问题的部分:Tkinter 是否支持画布中的多个标准$pathName find

于 2013-01-22T21:55:59.190 回答