キャンバス上の無関係な背景アイテムを表す重なり合った形状が多数あります。また、それぞれが「穴」である、重なり合わない円のパターンもあります。各「穴」スプライト (円) には、関連付けられた「穴」オブジェクトがありますが、コード内で明示的に記述されることはありません。(補足:これらのオブジェクトを使用してモデルとビューを論理的に関連付けたいと思っていますが、それを行うためのスマートな方法は見つかりませんでした)。それぞれの「穴」は異なり、効果も異なります。
任意の「穴」にドラッグできる小さな円形の「ボール」があります。この質問からドラッグアンドドロップする方法を見つけました。ボールが入った穴を見つける必要があります。
これまでのところ、私が見つけた最善の方法は次のとおりです。
穴スプライトの中心の座標を穴オブジェクトにマッピングする 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
それは非常に厄介なようです。これを行うには、もっとスマートな方法が必要だと思います。