0

キャンバス上の無関係な背景アイテムを表す重なり合った形状が多数あります。また、それぞれが「穴」である、重なり合わない円のパターンもあります。各「穴」スプライト (円) には、関連付けられた「穴」オブジェクトがありますが、コード内で明示的に記述されることはありません。(補足:これらのオブジェクトを使用してモデルとビューを論理的に関連付けたいと思っていますが、それを行うためのスマートな方法は見つかりませんでした)。それぞれの「穴」は異なり、効果も異なります。

任意の「穴」にドラッグできる小さな円形の「ボール」があります。この質問からドラッグアンドドロップする方法を見つけました。ボールが入った穴を見つける必要があります。

これまでのところ、私が見つけた最善の方法は次のとおりです。

  • 穴スプライトの中心の座標を穴オブジェクトにマッピングする 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
    

それは非常に厄介なようです。これを行うには、もっとスマートな方法が必要だと思います。

4

1 に答える 1

1

免責事項: 私は Python を使用していませんが、Tkinter に関する多くの質問は、私が持っている Tcl/Tk の経験から役立つ回答を得ることができます。この場合、Tcl で行うことを Tkinter で簡単に表現できるかどうかを判断するには、さらに作業が必要です。

まず、「識別子タグ」 ( hole_at_...) を追加しません。キャンバス アイテムに対応するモデル オブジェクトがある場合は、アイテムID (アイテムの作成中にキャンバスが返す) をインデックスとして使用して、オブジェクトを検索できるようにします。タグを解析しないアイテム ID。(そして、文字列識別子を追加する必要がある場合、座標から作成することにしたとしても、再解析を避けるために、まさにその文字列を辞書のキーとして使用します。後で座標が必要ですか?次に、それらをholeオブジェクトのプロパティにします) .

次に、複数のpathName find基準を持つサブコマンドを使用して、指定されたポイント最も近い(canvas id of) としてタグ付けされたアイテムを見つけます (穴から離れすぎたドロップを無視したい場合は問題ありません。最も近い穴が近すぎなくても使用する必要があります)。問題のある部分は次のとおりです。Tkinter はキャンバスで複数の基準をサポートしていますか?hole overlappingclosest$pathName find

于 2013-01-22T21:55:59.190 に答える