首页  >  文章  >  后端开发  >  如何确保我的自定义 Tkinter 文本小部件绑定在内置绑定之后执行?

如何确保我的自定义 Tkinter 文本小部件绑定在内置绑定之后执行?

Susan Sarandon
Susan Sarandon原创
2024-11-04 07:21:02962浏览

How Can I Ensure My Custom Tkinter Text Widget Bindings Execute After Built-in Bindings?

内置绑定后在 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn