Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解释Tkinter文本搜索方法_Python_Search_Tkinter_Tkinter.text - Fatal编程技术网

Python 解释Tkinter文本搜索方法

Python 解释Tkinter文本搜索方法,python,search,tkinter,tkinter.text,Python,Search,Tkinter,Tkinter.text,我不太明白text.search方法是如何工作的。 例如,有一句话:今天公园里出现了一辆红色汽车。我需要找到一辆红色汽车序列并突出显示它。可以找到,但我的突出显示如下所示: 我正在对句子使用self.text.search(word,start,stopindex=END)。看起来搜索方法的工作原理与python的regexp搜索完全相同。添加exact=True没有改变任何东西,因为这是默认行为,这就是为什么我不理解exact=True的实际含义。 如何使红色汽车正确突出显示?这可能是索引

我不太明白text.search方法是如何工作的。 例如,有一句话:
今天公园里出现了一辆红色汽车。
我需要找到
一辆红色汽车
序列并突出显示它。可以找到,但我的突出显示如下所示:

我正在对句子使用
self.text.search(word,start,stopindex=END)
。看起来搜索方法的工作原理与python的regexp搜索完全相同。添加
exact=True
没有改变任何东西,因为这是默认行为,这就是为什么我不理解exact=True的实际含义。
如何使
红色汽车
正确突出显示?

这可能是索引的问题

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

例如,我的方法工作良好:

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')

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

例如,考虑这个搜索:

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\u configure(“search”,background=“green”)
)的标记,您可以将此标记添加到匹配的开始和结束处,如下所示:

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

要高亮显示所有匹配项,只需将search命令放入一个循环中,并将起始位置调整为比上一个匹配项的结束位置晚一个字符

请注意,如果进行正则表达式搜索,您的解决方案将不起作用,因为匹配的长度不一定是模式的长度。此外,tkinter还有一种定义相对索引的方法。例如,您可以将“+10c”附加到索引中,以便稍后获得10个字符的索引。在您的示例中,您可以执行
“%s+%s c”%(pos,length)
而不是尝试从行和列计算新索引。我的标记添加代码是
self.text.tag\u add('style1',first\u word\u pos,end\u pos)
。问题是我没有尝试匹配一辆红色汽车的序列。我迭代每个单词,每个单词都被文本小部件搜索。当然,当它接收到
a
作为输入时,它会在今天的
停止。你说的意思是我每次都需要比较countVar和len(word)?但是countVar的输出不是整数,对吗?
countVar
可以是整数,如果您使用
IntVar
,或者您可以执行
int(countVar.get())
。我不知道你为什么要把countvar和单词的长度相比较。countvar告诉您匹配了多少个字符,您可以使用这些字符突出显示与您的模式匹配的字符的确切序列。@tasty:您的问题是,“我需要找到一辆红色汽车
序列”。你是说你不需要找到那个序列,而是需要先找到“a”这个词,再找到“red”这个词,再找到“car”这个词?如果是这样,您需要更新您的问题。不过,无论您是在搜索“a”、“红色”还是“红色汽车”,解决方案都是一样的。进行搜索,并获取索引。使用计数来计算匹配文本的长度。我不是只匹配
a
,我是匹配词性标记,限定符可以是
a
the
,直到text.search循环,你才知道这一点。例如:
DT car
查询可以是
a car
a car
我不明白的是,countVar如何帮助我正确匹配
一辆红色汽车
,以及如何在
今天找到一辆匹配的
并突出显示其中的
a
。很抱歉,也许我只是不明白我的意思是countVar如何帮助我消除今天
中的“a”和
a
之间的歧义?它返回匹配的字符数,不是吗?因此,在两种情况下,它都将返回1。