如何在 python 中使用 tkinter 更改某些字符的颜色?

How can I change the color of certain characters using tkinter in python?

我正在编写一个 brainfuck 编译器,我在更新文本颜色时遇到了问题,因为我希望不同的符号具有不同的颜色,具体取决于它们是什么。我目前正在使用此代码,但在尝试更改“[”和“]”符号的颜色时遇到问题。

colormap = {']': '#a94926', '+': '#cc7832', '-': '#cc7832', '<': '#6a8759', '>': '#6a8759', ',': '#6396ba',
        '.': '#6396ba', '[': '#a94926'}

def on_key(event):
if event.char in colormap:
    event.widget.tag_add(event.char, 'insert-1c')

editor.pack(expand=True, fill=BOTH, padx=(1.75, 2.5), pady=(2.5, 1.75))
for c in colormap:
    editor.tag_config(c, foreground=colormap[c])

editor.bind('<KeyRelease>', on_key)

这是编辑器的代码,用户在其中编写代码,但当用户编写 [ 或 ] 时,它不会着色。

我可以通过为 editor 使用 ScrolledText 小部件来实现此功能 FWIW,ttk.Entry 小部件似乎不支持 tag_addtag_config

import tkinter as tk
from tkinter.scrolledtext import ScrolledText

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('App')
        self.geometry('300x400')
        self.editor = ScrolledText(self)
        self.editor.pack(
            expand=True,
            fill=tk.BOTH,
            padx=(1.75, 2.5),
            pady=(2.5, 1.75),
        )
        self.colormap = {
            ']': '#a94926',
            '+': '#cc7832',
            '-': '#cc7832',
            '<': '#6a8759',
            '>': '#6a8759',
            ',': '#6396ba',
            '.': '#6396ba',
            '[': '#a94926',
        }
        for c in self.colormap:
            self.editor.tag_config(c, foreground=self.colormap[c])
    
        self.editor.bind('<KeyRelease>', self.on_key)

    def on_key(self, event):
        if event.char in self.colormap:
            event.widget.tag_add(event.char, 'insert-1c')

if __name__ == '__main__':
    app = App()
    app.mainloop()

为我的问题找到了解决方案,最终使用 pygments 包将文本分成不同的 BF 字符。 我创建了这两个新函数:

def colorFormat(event):
    code = editor.get('1.0', 'end-1c')
    i = 1
    for line in code.splitlines():
        editor.index("%d.0" % i)
        formatLine(line=i)
        editor.update()
        i += 1


def formatLine(line=None):
    start_range = 0
    index = editor.index('insert').split('.')

    if line is None:
        line = int(index[0])

    line_text = editor.get("{}.{}".format(line, 0), "{}.end".format(line))

    for token, content in lex(line_text, BrainfuckLexer()):
        end_range = start_range + len(content)
        keySet = content[0]
        if keySet in colormap:
        editor.tag_add(keySet, '{}.{}'.format(line, start_range), '{}.{}'.format(line, end_range))
        start_range = end_range

每次检测到按键时都会调用 colorFormat:

editor.bind('<KeyRelease>', colorFormat)

通过这两个函数,我还可以在用户每次打开新文件时调用colorFormat。