2009-10-04 61 views
1

我正在Python中编写一个小实用程序,它可以对文本进行一些模式匹配。与用户输入的模式相匹配的文本将突出显示为黄色。如何在高亮显示时删除文字的现有背景颜色?

我实现这个使用Tkinter的Text小部件,并建立名为"match"文本控件,让使用标记的名字"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() 

如果你运行它,然后突出显示所有在文本插件的文字,你会看到黄色背景的文本变得很难阅读。

注意,在上述代码段中我试着改变使用重点背景色:

w.config(highlightbackground="red") 

但是,这并没有奏效。

回答

3

标签优先。具有较高优先级的标签优先于那些具有较低优先级的标签。当你选择一个文本范围时,它会被赋予标签“sel”。你只需要提高“SEL”标签的优先级设置为你的“匹配”标签的优先级以上:

w.tag_raise("sel") 

亚历克斯·马尔泰利在评论中写道:“它会做OP absoluely [原文]没有好如果他设置了highlightbackground而不是selectbackground“但这是不正确的。虽然他设置highlightbackground与选择无关,但它对此解决方案没有任何影响。

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

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

+1

虽然你写的技术上是正确的,但如果他设置了highlightbackground而不是selectbackground(基本上,你需要这个答案_plus_我的第一段;-),那么它绝对没有好处。 – 2009-10-04 17:15:07

+0

你错了。我的解决方案通过或不通过配置highlightbackground或selectbackground来解决他的问题。我认为你只是因为我低估了你而低估了我。不同之处在于,我的解决方案适用于您的非解决方案。 – 2009-10-04 18:40:18

+0

我必须赞同布赖恩 - 使用w.tag_raise(“sel”)就是我在原始问题中提供的示例所需的全部内容。 – 2009-10-05 02:36:43

0

我认为你需要设置selectbackground,而不是highlightbackground,这意味着完全不同的东西(围绕一个小部件绘制的“高光矩形”在获得焦点时的颜色)。然而,我相信sel伪标签(代表选择,这是我认为你称为“高潮”)是“低于”用户创建的标签,如您的match;如果是这样,那么用户创建的标签的bg颜色将显示,而不是伪标签(又名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。

+1

虽然你写的技术上是正确的,但它实际上并没有解决问题,并暗示只能通过特定版本的Tk解决问题。 – 2009-10-04 17:11:38