python 我如何修改我的tkinter代码来在不同时刻突出显示文本小部件中多次出现的单词?

xyhw6mcr  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(135)

我有以下代码来突出显示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")
kx7yvsdv

kx7yvsdv1#

由于一次只需要找到一个匹配项,因此可以通过删除while循环来大大简化搜索功能,使其始终只搜索一次。
搜索函数设置两个特殊标记(索引),分别命名为matchStartmatchEnd。如果您在matchEnd处开始除第一次搜索之外的所有搜索,它将在上一次搜索之后找到下一个匹配项。对于第一次搜索,您可以使用索引"1.0"

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):
        count = tk.IntVar()
        index = self.search(pattern, start, end, count=count, regexp=regexp)
        if index != "":
            self.mark_set("matchStart", index)
            self.mark_set("matchEnd", "%s+%sc" % (index, count.get()))
            self.tag_add(tag, "matchStart", "matchEnd")

然后,您可以从由按钮或绑定触发的另一个函数调用此函数。该函数可以检查matchEnd是否存在,并使用适当的起点进行搜索。

text = CustomText(root)
...
def search(event=None):
    start = "1.0" if "matchEnd" not in text.mark_names() else "matchEnd"
    pattern = search_entry.get()
    text.highlight_pattern(pattern, "search", start)

相关问题