Python 3 Tkinter |在文本小部件

时间:2018-10-22 20:21:45

标签: python tkinter colors emoji 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:吗?这就是我想通过将文本小部件的粗体和颜色更改为该特定部分来以某种方式突出显示的内容。

问题:

  • 如何为:these_words:过滤文本?您可能会注意到,这些是emoji.demojized()表情符号,因此可选的解决方案是突出显示emoji.UNICODE_EMOJI列表中的所有单词,但我认为这会占用大量资源和时间(因为该列表包含超过1000个项目)

  • 如何突出显示所需的内容。即使我们可能会以某种方式解决第一个问题,但这些经过个性化处理的表情符号仍位于文本的中间...

修改

只需澄清一下:我知道如何突出显示this question中的文本。我只需要知道单词的位置以突出显示它,这是棘手的部分。还有:sun_with_face:。只要它以':'打开和关闭,并且之间没有没有空格()和换行符(\n)即可。

1 个答案:

答案 0 :(得分:1)

我想您要问的是如何对以冒号开头,具有一定范围的文本并以冒号结尾的文本应用突出显示。您可以使用文本小部件search方法找到与该模式匹配的文本,并可以通过使用文本小部件的标记功能来应用突出显示。

由于要针对模式进行搜索,因此需要使用正则表达式搜索。您可以通过在调用regexp方法时将True设置为search来实现。因为模式可以是任意长度,所以您还需要传入一个变量,以便tkinter可以返回匹配的字符数。您可以使用此信息来应用突出显示。

注意:使用正则表达式搜索时,表达式必须遵循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