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

时间:2012-03-31 16:50:11

标签: python string text tkinter

我希望能够双击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:

2 个答案:

答案 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不包含逗号。