如何在突出显示时删除文本的现有背景颜色?

时间:2009-10-04 07:09:10

标签: python colors background tkinter highlight

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

我正在使用Tkinter 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()

如果运行此项,然后突出显示“文本”小部件中的所有文本,您将看到具有黄色背景的文本变得非常难以阅读。

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

w.config(highlightbackground="red")

但这没效果。

2 个答案:

答案 0 :(得分:3)

标签具有优先权。具有高优先级的标签优先于具有较低优先级的标签。当您选择一系列文本时,会为其指定标签“sel”。您只需要将“sel”标记的优先级提高到“匹配”标记的优先级之上:

w.tag_raise("sel")

Alex Martelli在评论中写道“如果他设置了highlightbackground而不是selectbackground,它将会执行OP absoluely [sic]没有好处”,但这是不正确的。虽然他认为设置highlightbackground与选择无关,但它与此解决方案无关。

提高“sel”标签的优先级与原始问题中的代码一起使用,无论是否添加设置highlightbackground的代码。

有关文本小部件的更多信息,请查看text widget tutorial on tkdocs.com。它包含Tcl,Python,Ruby和Perl中的代码示例。

答案 1 :(得分:0)

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

使用Tk 8.5,您可以通过绑定到<Selection>伪事件来解决这个问题,该函数将伪标记sel的“适当颜色的用户标记”放在“顶部”;然而,在Tk 8.4中没有这样的事件,这是你今天最有可能使用的。 TK's docs表示8.5在Python for Windows的ActiveState发行版中附带了Python 3.1;遗憾的是,对于其他平台或其他版本的Python,只有“TODO”占位符 - 我不知道如何最好地获取您感兴趣的特定平台和python版本的Tk 8.5。