在 tkinter 文本小部件上,双击的默认行为是选择鼠标下的文本。
该事件将选择“”(空格)字符之间的所有字符。
所以 - 假设文本小部件有:1111111 222222
双击第一个单词(所有 1
)将仅选择它(双击 2
单词将选择它)
我想有类似的行为,但添加额外的字符作为工作分隔符(例如 .
、 (
、 )
)
目前,如果文本有 111111.222222
- 双击文本上的任意位置将突出显示所有字符(不会通过 .
分隔单词)
有没有办法做到这一点?
最佳答案
改变什么是“词”
双击定义为选择光标下的“单词”。如果您想更改所有文本小部件的默认行为,tkinter 有一种方法可以告诉它什么是“单词”字符。如果您更改 tkinter 认为的“单词”,您可以通过双击更改选择的内容。这就要求我们直接调用 tkinter 所基于的内置 tcl 解释器。
注意:这也会影响小部件的其他方面,例如用于将光标移动到单词开头或结尾的键绑定(bind)。
下面是一个例子:
import tkinter as tk
def set_word_boundaries(root):
# this first statement triggers tcl to autoload the library
# that defines the variables we want to override.
root.tk.call('tcl_wordBreakAfter', '', 0)
# this defines what tcl considers to be a "word". For more
# information see http://www.tcl.tk/man/tcl8.5/TclCmd/library.htm#M19
root.tk.call('set', 'tcl_wordchars', '[a-zA-Z0-9_.,]')
root.tk.call('set', 'tcl_nonwordchars', '[^a-zA-Z0-9_.,]')
root = tk.Tk()
set_word_boundaries(root)
text = tk.Text(root)
text.pack(fill="both", expand=True)
text.insert("end", "foo 123.45,678 bar")
root.mainloop()
自定义键绑定(bind)
如果您不想影响除一个小部件之外的任何小部件,或者不想影响依赖“单词”定义的 tkinter 的其他方面,您可以创建自己的绑定(bind)来选择您想要的任何东西。
要记住的重要一点是,您的绑定(bind)应该返回字符串
"break"
以防止双击的默认行为:def handle_double_click(event):
<your code for selecting whatever you want>
return "break"
...
text.bind("<Double-1>", handle_double_click)
为方便起见,文本小部件有一个
search
方法,可以在文本中向后和向前搜索给定的字符串或正则表达式。关于python - 如何在 Tkinter 文本小部件中配置默认的双击鼠标行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44625272/