在 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/

10-12 00:23
查看更多