我有以下代码来突出显示tk. Text中的单词匹配。
然而,这段代码将突出显示它一次找到的 * 所有 * 匹配(例如如果句子是“我的猫是我的朋友”,则它将在我第一次键入该词时突出显示“我的”的所有出现)。
我如何修改这段代码,使它在我第一次通过函数传递单词时只突出显示第一次出现的单词,然后当我第二次通过函数传递该单词时,它突出显示该单词的下一次出现(因此,在我的示例中,它将首先突出显示“mycat is my friend”,然后,在第二次运行时,“我的猫是我的朋友”
先谢谢你了!
class CustomText(tk.Text):
def __init__(self, *args, **kwargs):
tk.Text.__init__(self, *args, **kwargs)
def highlight_pattern(self, pattern, tag, start="1.0", end="end",
regexp=False):
start = self.index(start)
end = self.index(end)
self.mark_set("matchStart", start)
self.mark_set("matchEnd", start)
self.mark_set("searchLimit", end)
count = tk.IntVar()
while True:
index = self.search(pattern, "matchEnd","searchLimit",
count=count, regexp=regexp)
if index == "": break
if count.get() == 0: break # degenerate pattern which matches zero-length strings
self.mark_set("matchStart", index)
self.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
self.tag_add(tag, "matchStart", "matchEnd")
1条答案
按热度按时间kx7yvsdv1#
由于一次只需要找到一个匹配项,因此可以通过删除while循环来大大简化搜索功能,使其始终只搜索一次。
搜索函数设置两个特殊标记(索引),分别命名为
matchStart
和matchEnd
。如果您在matchEnd
处开始除第一次搜索之外的所有搜索,它将在上一次搜索之后找到下一个匹配项。对于第一次搜索,您可以使用索引"1.0"
。然后,您可以从由按钮或绑定触发的另一个函数调用此函数。该函数可以检查
matchEnd
是否存在,并使用适当的起点进行搜索。