如何在Tkinter Text小部件中修改当前选择的长度



我希望能够双击test,
在Tkinter Text小部件中,并让它选择test(并排除逗号)。

以下是我尝试过的:

import Tkinter as tk
def selection_mod(event=None):
    result = aText.selection_get().find(',')
    if result > 0:
        try:
            aText.tag_add("sel", "sel.first", "sel.last-1c")
        except tk.TclError:
            pass
lord = tk.Tk()
aText = tk.Text(lord, font=("Georgia", "12"))
aText.grid()
aText.bind("<Double-Button-1>", selection_mod)
lord.mainloop()

第一个问题是<Double-Button-1>似乎在进行选择之前触发了处理程序,从而产生:

TclError:PRIMARY选择不存在或表单"STRING"未定义

第二个问题是,即使使用有效的绑定,
我的选择标签似乎没有任何作用
它甚至不会引发错误,我尝试过不使用except tk.TclError:

您的绑定发生在默认绑定发生之前。因此,当绑定启动时,所选内容还不存在。因为绑定试图获取所选内容,所以它会失败,并显示您看到的错误。

您需要安排在类绑定之后进行绑定。一个廉价的破解方法是,一旦默认绑定有机会工作,就使用after来执行代码。或者,您可以使用bindtag功能来确保绑定在默认绑定之后激发。

第二个问题是,在设置新选项之前,您没有清除旧选项。您将需要执行tag_remove以首先删除现有的选择。否则,逗号(如果以某种方式选择了逗号)将保持选中状态,因为您所做的只是将标记重新应用于已经具有标记的文本。

然而,双击通常不会捕获逗号,所以我不太理解代码的要点。至少,当我在OSX上测试它时,它不包括逗号。

以下是我因Bryan的回答而想到的:

import Tkinter as tki # tkinter in Python 3
def selection_mod(event=None):
    result = txt.selection_get().find(',')
    if result > 0:
       fir, sec = txt.tag_ranges("sel")
       txt.tag_remove("sel", "sel.first", "sel.last")
       txt.tag_add("sel", fir, str(sec)+"-1c")
root = tki.Tk()
txt = tki.Text(root, font=("Georgia", "12"))
txt.grid()
txt.bind("<Double-Button-1>", lambda x: root.after(20, selection_mod))
root.mainloop()

值得注意的是,我使用的是Windows7,根据Bryan的说法,
双击单词时,OSX不包含逗号。

最新更新