Я стараюсь выделять тексты по токенам.Жетоны можно выделить с помощью приведенных ниже кодов, но есть некоторые нежелательные результатыНекоторые примеры:
Предположим, я набрал:
a = "a"
Оба a выделены одинаковым цветом, несмотря на то, что первый символ 'a' равен Token.Имя , второе «а» - Token.Literal.String.Double
Еще один нежелательный случай, когда я набрал «если», слово подсвечивается, и если я продолжаюЧтобы добавить несколько букв к слову «если», цвет слова изменяется, как и ожидалось.Однако, когда я удаляю некоторые буквы этого слова, пока слово снова не становится «если», это слово не выделяется, как раньше.
Можете ли вы помочь мне понять эту проблему здесь?
Коды:
#!/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")
elif token == Token.Name:
colorize(content, color="white")
TEXT.bind("<KeyRelease>", tag)
ROOT.mainloop()
`