基于Tkinter文本小部件中的第一个字符标记整个单词

时间:2018-05-06 02:20:23

标签: python tkinter

我正在尝试根据第一个字符标记并突出显示整个单词。在下面的示例中,我正在搜索标签“#”。我想标记并突出显示后续字符,直到下一个空格。因此字符“#hashtag”应全部突出显示为蓝色。下面的代码找到了主题标签,并将其突出显示为蓝色,但不突出显示后续字符。我假设问题是我没有在"wordend"中正确使用self.text_box.tag_add("hashtag{}".format(x), self.index, self.index + "wordend"),但我无法弄清楚我做错了什么。

根据effbot.org

  

“wordstart”和“wordend”将索引移动到开头(结束)   现在这个词。单词是字母,数字和字母的序列   下划线或单个非空格字符。   http://effbot.org/tkinterbook/text.htm

欢迎任何指示。

以下是一些复制问题的示例代码:

import tkinter as tk
import tkinter.scrolledtext as St

    class Main(tk.Tk):

    def __init__(self):

        tk.Tk.__init__(self)
        self.text = "random text\nrandom text\n#hashtag random text\n#hashtag"

        self.text_box = St.ScrolledText(self)
        self.text_box.pack()

        self.text_box.insert("1.0", self.text)

        self.index = self.text_box.search("#", "1.0", stopindex=tk.END)
        x = 0
        while self.index != "":
            self.text_box.tag_add("hashtag{}".format(x), self.index, self.index + "wordend")
            self.text_box.tag_configure("hashtag{}".format(x), foreground="blue")
            self.index += "+1c"
            self.index = self.text_box.search("#", self.index, stopindex=tk.END)
            x += 1

main=Main()
main.mainloop()

2 个答案:

答案 0 :(得分:1)

来自规范的tcl / tk文档:

  

单词由任意数量的相邻字符组成,字母,数字或下划线,或单个字符不是其中之一。如果给出了显示子修饰符,则仅检查非删除字符,否则将检查所有字符(是否删除)。

在你的情况下,“3.0”之后的字符是#,这是“不是其中之一”,因此单个字符被认为是一个单词,因此“wordend”修饰符在该单个字符后停止。

如果你想要一个hashtag加上它后面的单词给你的标签,你的第二个索引应该是“ line.char + 1c wordend”的形式(例如:“3.0 + 1c wordend” “)这样你就可以查找以哈希之后的第一个字符开头的单词的结尾,而不是以哈希本身开头。

答案 1 :(得分:0)

我通过将tag.add行更改为

来实现它
self.text_box.tag_add("hashtag{}".format(x), self.index, (self.index + "+1c") + " wordend").

但是我不确定为什么我需要在tag.add命令的结束索引中添加额外的字符?谁能解释一下?