2009-10-04 28 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