【问题标题】:Python 3 Tkinter | Change color/style for words in between ':' in Text WidgetPython 3 Tkinter |更改文本小部件中“:”之间的单词的颜色/样式
【发布时间】:2019-03-26 23:50:25
【问题描述】:

假设我们有这个文本:

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

  • 如何突出显示想要的东西。尽管我们可能会以某种方式解决第一个问题,但这些 emoji 表情符号在文本中间......

编辑

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

【问题讨论】:

  • 澄清一下:您问的是如何搜索:sun_with_face:,并为其添加标签?
  • 你说中间字符只能是a-z,但你给出的例子包括下划线。
  • @BryanOakley 哦,对了....我只是意识到它也可以有-&...等。忘记那句话。我的错。

标签: python tkinter colors emoji text-widget


【解决方案1】:

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

由于您要针对某个模式进行搜索,因此您需要使用正则表达式搜索。当您调用search 方法时,您可以通过将regexp 设置为True 来做到这一点。因为模式可以是任意长度,所以您还需要传入一个变量,以便 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

【讨论】:

  • 它工作得很好,虽然我注意到当这两个要突出显示的文本彼此相邻时::European_Union::Poland:,由于某种原因它只突出显示第一个.. .
  • 我不认为+'+1c'(在末尾索引加一个字符)是必要的。
  • @ProgramerBeginner:你是对的。我已经改变了这一点,并且稍微调整了模式。
猜你喜欢
  • 1970-01-01
  • 2018-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-14
  • 1970-01-01
  • 2021-05-15
相关资源
最近更新 更多