为什么在专门使用 <Control-o> 时会触发文本小部件事件 <<Modified>>?

Bly*_*yfh 3 python tkinter tkinter-text

我遇到了一个我似乎无法理解的错误。我有一个 tkinter Text 小部件,它有一个在文本修改时触发的绑定。由于某种原因,当我使用组合键时,该事件会被触发,尽管它不应该被触发,因为它不会修改文本小部件的内容。

奇怪的部分来了:这只发生在 <Control-o> 上。我编写了一个简单的程序来演示该问题。除了特殊的预先指定的组合键(例如实际修改内容的 <Control-i>)之外,没有其他组合具有这样的行为。

为什么 <Control-o> 会出现这种情况?我该如何预防呢?

import tkinter as tk
root = tk.Tk()
txt = tk.Text(root)
txt.pack()
root.bind("<Control-u>", lambda e: print("doesn't trigger"))
root.bind("<Control-o>", lambda e: print("somehow triggers"))
txt.bind("<<Modified>>", lambda e: print("text got modified!")) # (keep in mind that this will only get triggered once)
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 7

文本小部件上的默认绑定会<Control-o>添加换行符。这是来自文本小部件的官方 Tcl/Tk 文档中的绑定部分:

Control-o 通过在插入光标前面插入换行符来打开新行,而不移动插入光标。

从任何绑定返回字符串“break”会阻止对该事件的任何进一步处理。因此,您可以在返回字符串“break”的 control-o 的文本小部件上添加绑定。由于您的绑定是在小部件的默认绑定之前处理的,因此这将有效地防止默认绑定修改小部件。

txt.bind("<Control-o>", lambda e: "break")
Run Code Online (Sandbox Code Playgroud)