1

我正在用 Python 编写一个小实用程序,它可以对文本进行一些模式匹配。与用户输入的模式匹配的文本会以黄色突出显示。

我正在使用 TkinterText小部件实现此目的,并在名为 Text 的小部件上设置一个标签,该"match"标签为带有标签名称的任何文本提供"match"黄色背景。

这一切看起来都不错,除非我尝试使用鼠标突出显示文本(例如,当想要复制/粘贴时)。当我用鼠标突出显示文本时,任何已经具有黄色背景的标记文本都会保留其黄色背景,即使在突出显示之后也是如此。这意味着当文本被鼠标突出显示时,您无法正确阅读文本,因为黄色背景上的白色文本(被鼠标突出显示时文本变为白色)提供了不好的对比度。

我想要发生的是,当我使用鼠标突出显示文本小部件中的文本时,所有文本都会获得标准的蓝色背景颜色/白色文本颜色,您通常会在 Windows 机器上突出显示一个部分的文本。

这是一个快速的代码片段来演示我的意思:

from tkinter import *

root = Tk()

w = Text(root)
w.tag_config("match",background="yellow")
w.config(highlightbackground="red")
w.pack()
w.insert(INSERT,"some non-matching text.")
w.insert(INSERT,"some matching text.","match")

root.mainloop()

如果您运行此程序,然后突出显示 Text 小部件中的所有文本,您会看到带有黄色背景的文本变得非常难以阅读。

请注意,在上面的代码片段中,我尝试使用以下方法更改突出显示背景颜色:

w.config(highlightbackground="red")

但这没有奏效。

4

2 回答 2

3

标签有优先权。具有高优先级的标签优先于具有较低优先级的标签。当您选择一个文本范围时,它会被赋予标签“sel”。您只需将“sel”标签的优先级提高到高于“match”标签的优先级即可:

w.tag_raise("sel")

Alex Martelli 在评论中写道:“如果他设置 highlightbackground 而不是 selectbackground,那么它对 OP 绝对没有好处 [原文如此]”,但这是不正确的。虽然他认为设置 highlightbackground 与选择无关是正确的,但它与此解决方案无关。

提高“sel”标签的优先级适用于原始问题中的代码,无论是否添加设置高亮背景的代码。

有关文本小部件的更多信息,请查看tkdocs.com 上的文本小部件教程。它有 Tcl、Python、Ruby 和 Perl 的代码示例。

于 2009-10-04T17:04:59.557 回答
0

我认为你需要设置selectbackground,而不是highlightbackground意味着完全不同的东西(当它获得焦点时围绕小部件绘制的“突出显示矩形”的背景颜色)。但是,我相信sel伪标签(代表选择,我认为您称之为“突出显示”)是“低于”用户创建的标签,例如您的match; 如果是这样,那么将显示用户创建标签的 bg 颜色,而不是sel伪标签(aka selectbackground)的 bg 颜色。

使用 Tk 8.5,您可以通过绑定到<Selection>伪事件的函数来解决这个问题,该函数将适当颜色的用户标签放置在伪标签“顶部” sel;但是,在 Tk 8.4 中没有这样的事件,而这正是您今天最有可能使用的。 TK 的文档说 8.5 随 Python 3.1 一起出现在 Python for Windows 的 ActiveState 发行版上;不幸的是,只有关于其他平台或其他 Python 版本的“TODO”占位符——我不知道如何为您感兴趣的特定平台和 python 版本最好地获取 Tk 8.5。

于 2009-10-04T16:42:59.517 回答