【问题标题】:How to remove existing background color of text when highlighting?突出显示时如何删除文本的现有背景颜色?
【发布时间】:2010-12-03 16:50:34
【问题描述】:

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

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

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

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

这里有一个快速的代码 sn-p 来说明我的意思:

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 小部件中的所有文本,您会发现带有黄色背景的文本变得非常难以阅读。

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

w.config(highlightbackground="red")

但这没有奏效。

【问题讨论】:

    标签: python colors background tkinter highlight


    【解决方案1】:

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

    w.tag_raise("sel")
    

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

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

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

    【讨论】:

    • 虽然你写的东西在技术上是正确的,但如果他设置 highlightbackground 而不是 selectbackground ,它对 OP 绝对没有好处(基本上,你需要这个答案 plus 的第一段我的;-)。
    • 你错了。我的解决方案解决了他的问题,无论是否配置高亮背景或选择背景。我认为你对我投了反对票只是因为我对你投了反对票。不同之处在于,我的解决方案适用于您的非解决方案。
    • 我必须同意 Bryan - 使用 w.tag_raise("sel") 是我在原始问题中提供的示例所需要的全部内容。
    【解决方案2】:

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

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

    【讨论】:

    • 虽然您写的内容在技术上是正确的,但它实际上并不能解决问题,并且暗示问题只能通过特定版本的 Tk 来解决。
    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 2014-01-15
    相关资源
    最近更新 更多