6

ttk.Treeviewファイルシステムツリーのコンテンツを入力しているインスタンスを使用した簡単なスクリプトがあります。(葉)アイテムがクリックされたときに特定の操作を実行したいので、次のようにハンドラーを構成しました。

self.tree.tag_bind('#entry', '<1>', self.onClick)

この方法onClickでは、次のように、クリックされたアイテムを単に印刷しています。

def onClick(self, event):
    item_id = str(self.tree.focus())
    print 'Selected item was %s' % item_id
    item = self.tree.item(item_id)
    flag = '#another_tag' in item['tags']
    print '  flag = %s' % flag

メッセージのクリック数が1つ遅れていることがわかりました。したがって、最初のクリックでランダムな値(ツリーのルートのように見えます)が取得され、n番目のクリックでクリックされた(n-1)番目のアイテムの値が出力されます。

それらは次のように挿入されました: tree.insert(parent_id, 'end', id, text=id, tags=['#entry'])

これがTkinterのバグなのか、それとも私が間違っていることなのか、誰か知っていますか?

これは、UbuntuNattyとOSX Lionの両方で問題のようです(デフォルトのプリインストールバージョンのPythonとTkinterを使用)

4

1 に答える 1

6

これは、Tkinterが機能するように設計されている方法です。ウィジェットのバインディングは、ウィジェットクラスのバインディングの前に処理されます。選択したアイテムを設定するのは、ウィジェットクラスのバインディングです。これにより、デフォルトのバインディングを拡張するのが少し難しくなりますが、デフォルトのバインディングをオーバーライドするのは非常に簡単になります。

これは、このサイトで数回尋ねられています。このサイトで「bindtags」を検索してください。bindtagsは、イベント処理の順序を制御するメカニズムです。

ツリービューウィジェットの特定のケースでは、<<TreeviewSelect>>イベントにバインドすることをお勧めします。イベントは、選択が設定された後に処理されます。次に、このメソッドを使用して、tag_hasクリックされたノードの種類を判別できます。

于 2012-08-21T22:47:31.410 に答える