如何在 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_add
或 tag_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。
我正在编写一个 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_add
或 tag_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。