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

2024-04-23 16:01:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望能够双击test,
在Tkinter文本小部件中,并让它选择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 selection doesn't exist or form "STRING" not defined

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


Tags: test文本mod部件tkinterbuttonresulttk
2条回答

绑定发生在默认绑定发生之前。因此,当绑定激发时,选择还不存在。因为您的绑定尝试获取选择,所以失败,并出现您看到的错误。在

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

第二个问题是,在设置新选项之前,您没有清除旧的选择。您需要做tag_remove来首先删除现有的选择。如果标记已经被选中,那么它将保持不变。在

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

感谢布莱恩的回答,我得出了以下结论:

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不包括逗号。在

相关问题 更多 >