2015-04-17 64 views
0

我一直在嘗試將tkinter文本小部件的語法突出顯示。但是,使用this post上的代碼,我無法使其工作。沒有錯誤,但文本沒有突出顯示,每行後面都有一行跳過。如果有更好的方法將語法突出顯示與tkinter文本小部件合併,我很樂意聽到它。這是我能找到的最小碼重複的問題:python tkinter文本小部件中的pygments語法突出顯示

import Tkinter 
import ScrolledText 
from pygments import lex 
from pygments.lexers import PythonLexer 

root = Tkinter.Tk(className=" How do I put an end to this behavior?") 
textPad = ScrolledText.ScrolledText(root, width=100, height=80) 
textPad.tag_configure("Token.Comment", foreground="#b21111") 
code = textPad.get("1.0", "end-1c") 
# Parse the code and insert into the widget 
def syn(event=None): 
    for token, content in lex(code, PythonLexer()): 
     textPad.insert("end", content, str(token)) 
textPad.pack() 
root.bind("<Key>", syn) 
root.mainloop() 

到目前爲止,我還沒有找到一個解決這個問題的(不然我也不會在這裏發佈)。任何有關語法突出tkinter文本小部件的幫助將不勝感激。

注:這是Python 2.7版與Windows 7

回答

1

鏈接到您的設計更突出顯示已經存在的問題的代碼文本,而它看起來像你試圖在你鍵入時突出顯示它。

我可以給你一些建議讓你開始,雖然我從來沒有這樣做過,也不知道最有效的解決方案是什麼。答案中的解決方案只是一個起點,並不能保證它實際適合您的問題。

短暫的概要是這樣的:不要設置插入任何東西的綁定。相反,只需突出顯示默認綁定插入的內容即可。

爲此,第一步是綁定<KeyRelease>而不是<Key>。不同之處在於<KeyRelease>會發生之後已經插入了一個字符,而<Key>發生了之前插入了一個字符。

其次,您需要從詞法分析器獲取標記,並將標記應用於每個標記的文本。爲此,您需要跟蹤文檔中詞法分析器的位置,然後使用令牌的長度來確定令牌的結尾。

在下面的溶液I創建的標記("range_start")來指定的當前位置,其中Pygments來做詞法分析器是在該文件中,然後計算基於開始標誌"range_end",並且通過Pygments來做返回令牌的長度。我不知道在多字節字符面前它有多強大。現在,讓我們假設單字節字符。

def syn(event=None): 
    textPad.mark_set("range_start", "1.0") 
    data = textPad.get("1.0", "end-1c") 
    for token, content in lex(data, PythonLexer()): 
     textPad.mark_set("range_end", "range_start + %dc" % len(content)) 
     textPad.tag_add(str(token), "range_start", "range_end") 
     textPad.mark_set("range_start", "range_end") 

這是瘋了效率低下,因爲它重新應用突出顯示到每個按鍵上的整個文檔。有很多方法可以最大限度地減少這種情況,例如只在每個單詞之後突出顯示,或者GUI變爲空閒或某種其他類型的觸發器。

+0

謝謝您的回答。我有一個問題。我如何使這個應用語法突出顯示所有Python代碼(我將如何擴展這個超越註釋?)?我很抱歉,但我無法弄清楚如何在這種情況下應用pygments文檔。 –

+0

您可以在循環中添加一個打印語句來打印出令牌名稱,然後您只需要像爲「Token.Comment」一樣配置每個名稱的顏色。 –

+0

根據細分[文檔](http://pygments.org/docs/styles/),有些預製樣式與分節符一起提供。不過,我不知道我怎麼能使用這些用'tkinter',這樣我就不必創建一個'tag'爲每'token'。我將如何做到這一點? –

0

來突出某些用詞,你可以這樣做:

textarea.tag_remove("tagname","1.0",tkinter.END) 
first = "1.0" 
while(True): 
    first = textarea.search("word_you_are_looking_for", first, nocase=False, stopindex=tkinter.END) 
    if not first: 
     break 
    last = first+"+"+str(len("word_you_are_looking_for"))+"c" 
    textarea.tag_add("tagname", first, last) 
    first = last 
textarea.tag_config("tagname", foreground="#00FF00") 
+0

對於縮進抱歉,它不喜歡我的代碼! –

+0

感謝您的修復 –

相關問題