内置绑定后在 Tkinter 文本小部件中绑定自定义事件
理解问题
在 Tkinter 的文本小部件中,您可能会遇到这样的情况:您的自定义事件绑定在小部件的内置绑定之前执行,从而导致文本更新出现差异。
解决方案
要解决此问题,您可以更改事件的处理顺序。 Tkinter 小部件被分配了一个“bindtags”层次结构,用于确定绑定执行的顺序。
1.重新排列 Bindtags
bindtags 的默认顺序是:widget、class、toplevel、all。您可以通过将小部件绑定标签放置在类绑定标签之后来更改顺序。这样,类绑定将在小部件绑定之前执行。
<code class="python"># Modify the bindtags to rearrange the order entry.bindtags(('Entry', '.entry', '.', 'all'))</code>
2.引入附加绑定标签
或者,您可以在类bindtag之后创建一个新的绑定标签,并将自定义事件绑定到这个新标签。
<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中文网其他相关文章!