解释Tkinter文本搜索方法

时间:2013-10-19 10:07:12

标签: python search tkinter

我不太明白text.search方法是如何工作的。 例如,有一句话:Today a red car appeared in the park.我需要找到a red car序列并突出显示它。它被发现,但这是我突出显示的样子:

enter image description here

enter image description here

我在句子上使用self.text.search(word, start, stopindex=END)。看起来搜索方法与python的regexp搜索完全相同。添加exact=True没有改变任何东西,因为它是默认行为,这就是为什么我不明白exact = True实际意味着什么。 如何正确突出显示a red car

2 个答案:

答案 0 :(得分:9)

搜索方法返回起始索引处或之后的第一个匹配的索引,以及可选的匹配字符数。您有责任使用此信息突出显示所发现的内容。

例如,请考虑以下搜索:

countVar = tk.StringVar()
pos = text.search("a red car", "1.0", stopindex="end", count=countVar)

如果找到匹配项,pos将包含匹配项的第一个字符的索引,countVar将包含匹配的字符数。您可以使用此信息通过使用“index + N chars”形式的索引或缩写“index + Nc”来突出显示匹配。例如,如果pos为2.6且count为9,则匹配的最后一个字符的索引为2.6+9c

有了这个,并且假设您已经配置了一个名为“search”的标签(例如:text.tag_configure("search", background="green")),您可以将此标记添加到匹配的开头和结尾,如下所示:

text.tag_add("search", pos, "%s + %sc" (pos, countVar.get()))

要突出显示所有匹配项,只需将搜索命令放在循环中,然后将起始位置调整为超过上一个匹配结束的一个字符。

答案 1 :(得分:0)

这可能是索引的问题。

在我的程序中,我必须搜索起始索引并计算结束索引

我的方法,例如,它工作正常:

def highlight(self):
    start = 1.0
    pos = self.area_example.search(self.item.name, start, stopindex=END)
    while pos:
        length = len(self.item.name)
        row, col = pos.split('.')
        end = int(col) + length
        end = row + '.' + str(end)
        self.area_example.tag_add('highlight', pos, end)
        start = end
        pos = self.area_example.search(self.item.name, start, stopindex=END)
    self.area_example.tag_config('highlight', background='white', foreground='red')