独立用Python实现让tk的ScrolledText识别大括号,并可折叠大括号,以及关键符号';'变红,'+'变绿
时间: 2023-12-09 19:03:28 浏览: 30
好的,这个问题有点复杂。首先需要明确一下,你想让 ScrolledText 在什么情况下识别大括号并可折叠?是在文本输入框中输入的内容中吗?如果是,那么需要监听文本输入框的内容变化事件,并对输入的文本进行分析和处理。
以下是一个简单的实现方式:
```python
import tkinter as tk
from tkinter import scrolledtext, filedialog, messagebox
class FoldingText(scrolledtext.ScrolledText):
def __init__(self, master=None, **kw):
super().__init__(master, **kw)
self.tag_config('brace', foreground='blue')
self.tag_config('semicolon', foreground='red')
self.tag_config('plus', foreground='green')
self.bind('<KeyRelease>', self.handle_key_release)
self.bind('<<ContentChanged>>', self.handle_content_change)
def handle_key_release(self, event):
self.mark_braces()
self.mark_semicolons()
self.mark_plus()
def handle_content_change(self, event):
self.mark_braces()
self.mark_semicolons()
self.mark_plus()
def mark_braces(self):
brace_stack = []
self.tag_remove('brace', '1.0', tk.END)
for line in self.get('1.0', tk.END).split('\n'):
for i, char in enumerate(line):
if char == '{':
brace_stack.append((i, self.index(f'{line}.{i}')))
elif char == '}':
if brace_stack:
start = brace_stack.pop()[1]
end = self.index(f'{line}.{i}')
self.tag_add('brace', start, end)
def mark_semicolons(self):
self.tag_remove('semicolon', '1.0', tk.END)
for line in self.get('1.0', tk.END).split('\n'):
index = '1.0'
while True:
index = self.search(';', index, stopindex=tk.END)
if not index:
break
self.tag_add('semicolon', index, f'{index}+1c')
index = f'{index}+1c'
def mark_plus(self):
self.tag_remove('plus', '1.0', tk.END)
for line in self.get('1.0', tk.END).split('\n'):
index = '1.0'
while True:
index = self.search('\\+', index, stopindex=tk.END)
if not index:
break
self.tag_add('plus', index, f'{index}+1c')
index = f'{index}+1c'
if __name__ == '__main__':
root = tk.Tk()
text = FoldingText(root)
text.pack(fill=tk.BOTH, expand=True)
root.mainloop()
```
这个代码实现了让 ScrolledText 可以识别大括号、将分号标记为红色、将加号标记为绿色。在输入框中输入文本时,程序会自动监听文本变化事件,并对文本进行处理和标记。
需要注意的是,这个代码实现的是一个简单的标记功能,还有很多地方可以进一步完善。例如,对于嵌套的大括号,目前的代码可能会出现错误。另外,如果需要实现折叠大括号的功能,还需要进一步的代码实现。