我希望能够双击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:
。
答案 0 :(得分:1)
您的绑定在默认绑定发生之前发生。因此,当绑定触发时,选择尚不存在。因为您的绑定试图获取选择,它会因您看到的错误而失败。
您需要在类绑定后安排绑定。一个廉价的黑客就是在默认绑定有机会工作后使用after
来执行你的代码。或者,您可以使用bindtag
功能确保绑定在默认绑定后触发。
第二个问题是在设置新选项之前不清除旧选择。您需要先tag_remove
删除现有选择。否则,逗号(如果以某种方式选择)将保持选中状态,因为您所做的只是将标记重新应用于已具有标记的文本。
但是,双击通常不会捕获逗号,所以我不太明白你的代码点。至少,当我在OSX上测试它时,它不包含逗号。
答案 1 :(得分:1)
感谢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()
值得注意的是,我使用的是Windows 7,据Bryan说 双击单词时OSX不包含逗号。