独立用Python实现让tk的ScrolledText识别大括号,并可手动点击折叠大括号,以及关键符号';'变红,关键符号'+'变绿
时间: 2023-12-09 15:03:28 浏览: 23
好的,这个问题需要实现两个功能:1. 让 ScrolledText 可以识别大括号并标记;2. 实现手动折叠大括号的功能。下面是一个实现这两个功能的示例代码:
```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)
self.bind('<Button-1>', self.handle_click)
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 handle_click(self, event):
index = self.index(f'@{event.x},{event.y}')
if self.tag_nextrange('brace', index) is not None:
self.toggle_brace(index)
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'
def toggle_brace(self, index):
tag = 'folded' if self.tag_nextrange('folded', index) is None else 'unfolded'
start = self.tag_prevrange('brace', index)[1]
end = self.tag_nextrange('brace', index)[0]
self.tag_remove(tag, start, end)
if tag == 'folded':
self.tag_add(tag, start, end)
```
这个代码实现了让 ScrolledText 可以识别大括号、将分号标记为红色、将加号标记为绿色,并且实现了手动折叠大括号的功能。在输入框中输入文本时,程序会自动监听文本变化事件,并对文本进行处理和标记。当用户点击一个大括号时,程序会自动折叠或展开与之匹配的大括号。
需要注意的是,这个代码实现的是一个简单的折叠功能,还有很多地方可以进一步完善。例如,目前的代码可能会出现错误,如果大括号的嵌套层数过多。另外,如果需要实现展开和折叠所有大括号的功能,还需要进一步的代码实现。