我希望能够双击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不包含逗号。