如何在高亮时去除文本的背景颜色?
我正在用Python写一个小工具,主要是用来匹配文本的模式。用户输入的符合模式的文本会被高亮显示成黄色。
我使用的是Tkinter的Text
组件,并在这个组件上设置了一个叫"match"
的标签,这样任何带有这个标签的文本就会有黄色的背景。
整体效果看起来不错,但当我用鼠标高亮文本时(比如想要复制粘贴的时候),已经有黄色背景的文本在被高亮后仍然保持黄色背景。这就导致了一个问题:当文本被鼠标高亮时,白色的文字(鼠标高亮时文字变成白色)在黄色背景上看起来很难辨认。
我希望的是,当我用鼠标在Text组件中高亮文本时,所有文本都能变成标准的蓝色背景和白色文字,这种效果在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")
但这并没有成功。
2 个回答
我觉得你需要设置的是 selectbackground
,而不是 highlightbackground
,因为后者的意思完全不同(它是指当一个小部件获得焦点时,周围绘制的“高亮矩形”的背景颜色)。不过,我认为 sel
这个伪标签(代表选择的内容,我觉得你称之为“高亮”的东西)是“低于”用户创建的标签,比如你的 match
;如果是这样的话,用户创建的标签的背景颜色会显示出来,而不是 sel
伪标签(也就是 selectbackground
)的背景颜色。
在 Tk 8.5 中,你可以通过绑定 <Selection>
这个伪事件来解决这个问题,绑定一个函数,让适当颜色的用户标签“覆盖”在伪标签 sel
之上;然而,在 Tk 8.4 中没有这样的事件,而这很可能就是你现在使用的版本。 TK 的文档 说 8.5 版本是与 Python 3.1 一起在 ActiveState 的 Windows 版本中提供的;不幸的是,关于其他平台或其他版本的 Python 只有“待办”占位符——我不知道如何最好地为你感兴趣的特定平台和 Python 版本获取 Tk 8.5。
标签有优先级。优先级高的标签会优先于优先级低的标签。当你选择一段文字时,它会被标记为“sel”。你只需要把“sel”标签的优先级提高到高于“match”标签的优先级就可以了:
w.tag_raise("sel")
Alex Martelli在评论中提到“如果他设置highlightbackground而不是selectbackground,对OP完全没有帮助”,但这说法是不对的。虽然他说设置highlightbackground和选择没有关系,但这并不影响这个解决方案。
提高“sel”标签的优先级可以和原问题中的代码一起使用,无论是否添加了设置highlightbackground的代码。
想了解更多关于文本组件的信息,可以查看tkdocs.com上的文本组件教程。里面有Tcl、Python、Ruby和Perl的代码示例。