組み込みバインディング後の Tkinter テキスト ウィジェットでのカスタム イベントのバインド
問題の理解
Tkinter のテキスト ウィジェットでは、ウィジェットの組み込みバインディングよりも前にカスタム イベント バインディングが実行され、テキストの更新に不一致が生じる状況が発生する可能性があります。
解決策
この問題に対処するには、イベントが処理される順序を変更できます。 Tkinter ウィジェットには、バインディングの実行順序を決定する「バインドタグ」の階層が割り当てられます。
1.バインドタグの再配置
バインドタグのデフォルトの順序は、ウィジェット、クラス、トップレベル、すべてです。クラスのバインドタグの後にウィジェットのバインドタグを配置することで、順序を変更できます。こうすることで、クラス バインディングはウィジェット バインディングより前に実行されます。
<code class="python"># Modify the bindtags to rearrange the order entry.bindtags(('Entry', '.entry', '.', 'all'))</code>
2.追加のバインドタグの導入
または、クラス バインドタグの後に新しいバインドタグを作成し、カスタム イベントをこの新しいタグにバインドすることもできます。
<code class="python"># Create a new bindtag "post-class-bindings" after the class bindtag entry.bindtags(('.entry','Entry','post-class-bindings', '.', 'all')) # Bind your custom events to "post-class-bindings" entry.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress)</code>
両方のアプローチの利点
コード例
次のコードは、両方のアプローチを示しています。
<code class="python">import Tkinter def OnKeyPress(event): value = event.widget.get() string="value of %s is '%s'" % (event.widget._name, value) status.configure(text=string) root = Tkinter.Tk() entry1 = Tkinter.Entry(root, name="entry1") entry2 = Tkinter.Entry(root, name="entry2") entry3 = Tkinter.Entry(root, name="entry3") # Three different bindtags entry1.bindtags(('.entry1', 'Entry', '.', 'all')) entry2.bindtags(('Entry', '.entry2', '.', 'all')) entry3.bindtags(('.entry3','Entry','post-class-bindings', '.', 'all')) # Bind the first two entries to the default bind tags entry1.bind("<KeyPress>", OnKeyPress) entry2.bind("<KeyPress>", OnKeyPress) # Bind the third entry to the "post-class-bindings" bind tag entry3.bind_class("post-class-bindings", "<KeyPress>", OnKeyPress) # ... Continue with your GUI code </code>
以上がカスタム Tkinter テキスト ウィジェット バインディングが組み込みバインディングの後に実行されるようにするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。