我不太明白text.search方法是如何工作的。
例如,有一句话:Today a red car appeared in the park.
我需要找到a red car
序列并突出显示它。它被发现,但这是我突出显示的样子:
我在句子上使用self.text.search(word, start, stopindex=END)
。看起来搜索方法与python的regexp搜索完全相同。添加exact=True
没有改变任何东西,因为它是默认行为,这就是为什么我不明白exact = True实际意味着什么。
如何正确突出显示a red car
?
答案 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')