Python 3 个 Tkinter |在文本小部件中为“:”之间的单词更改 color/style

Python 3 Tkinter | Change color/style for words in between ':' in Text Widget

假设我们有这段文字:

text = "You don't need to try to find hidden meaning:\nin this text :sun_with_face:!\nthis text : does not have any :meaning :D"

现在注意到上面文字中的 :sun_with_face: 了吗?这就是我试图通过将文本小部件的粗体和颜色更改为特定部分来以某种方式突出显示的内容。

问题:

编辑

澄清一下:我知道如何突出显示 this question 中的文本。我只需要知道单词的位置以突出显示它,这是棘手的部分。还有:sun_with_face:。它可以是任何东西,只要它用':'打开和关闭,中间有 no 空格 (</code>) 和换行符 (<code>\n).

我想您要问的是如何将突出显示应用于以冒号开头、具有某种文本跨度并以冒号结尾的文本。您可以使用文本小部件 search 方法找到与该模式匹配的文本,并且可以使用文本小部件的标记功能应用突出显示。

由于您要根据模式进行搜索,因此需要使用正则表达式搜索。您可以通过在调用 search 方法时将 regexp 设置为 True 来实现。因为模式可以是任意长度,所以你还需要传入一个变量,这样 tkinter 就可以 return 它匹配了多少个字符。您可以使用此信息来应用突出显示。

注意:使用正则表达式搜索时,表达式必须跟在 Tcl regular expression syntax 之后,而不是 python 之后。有一些细微的差别。

下面的示例查找冒号后紧接最短的非空白字符组和冒号的所有匹配项。然后它将标签 "highlight" 添加到每个匹配项:

countVar = tk.IntVar()
start_index = "1.0"
while start_index:
    index = text_widget.search(r':\S+?:', start_index, stopindex="end",
                               count=countVar, regexp=True)
    if index:
        # ie: a match was found
        end_index = "{} + {} chars".format(index, countVar.get())
        text_widget.tag_add("highlight", index, end_index)
        start_index = end_index
    else:
        start_index = None