Merhaba.
Tkinter ve Pygments kullanarak basit bir metin düzenleyicisi yapmaya çalışırken, henüz çözümünü bulamadığım beklenmeyen bir durumla karşılaştım. Programdan yapmasını beklediğim, yazdığım yazılar şayet Python söz dizimine uyuyorsa bu yazıları renklendirmek. Aslında programın tokenleri ayırt edip token tipine göre renklendirmesinde sorun yok. Ancak bazı durumlarda istenmeyen sonuçlarla karşılaşıyorum.
Örneğin:
yukarıdaki gibi yazdığımda, a değişkeni de string “a” değişkeninin rengine bürünüyor. Veya bazı durumlarda renk değişikliği gerçekleşmiyor.
Ve herhangi bir script’teki tüm kodları pencere içine aktardığımda da istenmeyen sonuçlar oluşuyor.
Yani bir harf grubu (örneğin ‘if’) renklendirilince, metinde if içeren bütün sözcüklerin if kısmı renklenmeye başlıyor.
Acaba bu sorunu çözebilmek için nasıl bir yol izlememi önerirsiniz?
Kodlar:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from pygments import lex
from pygments.token import Token
from pygments.lexers import Python3Lexer
try:
import Tkinter as tk
except ImportError:
import tkinter as tk
ROOT = tk.Tk()
TEXT = tk.Text(master=ROOT, fg="white", bg="black", font="TkDefaultFont 10")
TEXT.pack(fill="both", expand=True)
def tag(event):
def colorize(word, color):
index = []
index1 = TEXT.search(word, "1.0", "end")
while index1:
index2 = ".".join([index1.split(".")[0], str(int(index1.split(".")[1]) + len(word))])
index.append((index1, index2))
index1 = TEXT.search(word, index2, "end")
for i, j in index:
TEXT.tag_add(word, i, j)
TEXT.tag_configure(word, foreground=color)
for token, content in lex(TEXT.get("1.0", "end"), Python3Lexer()):
if token == Token.Literal.Number.Integer:
colorize(content, color="purple")
elif token == Token.Keyword:
colorize(content, color="orange")
elif token == Token.Operator.Word:
colorize(content, color="red")
elif token == Token.Name.Builtin:
colorize(content, color="blue")
elif token == Token.Comment.Hashbang or token == Token.Comment.Single:
colorize(content, color="grey")
elif token == Token.Keyword.Namespace:
colorize(content, color="yellow")
elif token == Token.Namespace:
colorize(content, color="green")
elif token == Token.Punctuation:
colorize(content, color="brown")
elif token == Token.Literal.String.Double:
colorize(content, color="cyan")
TEXT.bind("<KeyRelease>", tag)
ROOT.mainloop()