独立使用Python实现: 将分号标记为红色、将加号标记为绿色,并且实现了手动折叠大括号的功能。在输入框中输入文本时,程序会自动监听文本变化事件,并对文本进行处理和标记。若输入'{',那么该行左侧会自动添加显示出一个小按钮,有几个'{',则在相应行的左侧添加几个小按钮,当然删除'{'对应行按钮也会消失,当用户点击'{'行左侧的小按钮时,程序会自动折叠或展开与之匹配的大括号,若未发现与之匹配的'}',则点击该按钮无效。
时间: 2023-12-09 07:03:28 浏览: 167
非常感谢您的问题!下面是一个可以实现您所要求功能的代码示例:
```python
import re
import tkinter as tk
def mark_symbols(text):
# 标记分号和加号
semicolon_re = re.compile(r';')
plus_re = re.compile(r'\+')
text.tag_remove('semicolon', '1.0', 'end')
text.tag_remove('plus', '1.0', 'end')
for match in semicolon_re.finditer(text.get('1.0', 'end')):
start = '1.0+' + str(match.start()) + 'c'
end = '1.0+' + str(match.end()) + 'c'
text.tag_add('semicolon', start, end)
for match in plus_re.finditer(text.get('1.0', 'end')):
start = '1.0+' + str(match.start()) + 'c'
end = '1.0+' + str(match.end()) + 'c'
text.tag_add('plus', start, end)
# 定时更新标记
root.after(100, mark_symbols, text)
def add_button(text, index, count):
# 添加小按钮
button = tk.Button(text, text='{', command=lambda: toggle_brackets(text, index, count))
text.window_create(index, window=button)
text.tag_add('bracket', index)
def remove_button(text, index, count):
# 移除小按钮
text.tag_remove('bracket', index, f'{index}+1c')
for i in range(1, count+1):
text.delete(f'{index}+1c', f'{index}+2c')
def toggle_brackets(text, index, count):
# 切换大括号的状态
end = text.search('}', index, f'end + {count} lines')
if end:
text.tag_remove('hidden', index, end)
text.tag_add('visible', index, end)
else:
text.tag_remove('visible', index, f'end + {count} lines')
text.tag_add('hidden', index, f'end + {count} lines')
def on_text_changed(event):
# 处理文本变化事件
mark_symbols(text)
for line in range(1, int(text.index('end').split('.')[0])):
# 检查每一行是否有大括号
count = text.get(f'{line}.0', f'{line}.end').count('{')
if count > 0 and not text.tag_ranges(f'line{line}'):
# 添加小按钮
add_button(text, f'{line}.0', count)
text.tag_add(f'line{line}', f'{line}.0', f'{line}.end')
elif count == 0 and text.tag_ranges(f'line{line}'):
# 移除小按钮
remove_button(text, f'{line}.0', count)
text.tag_remove(f'line{line}', f'{line}.0', f'{line}.end')
root = tk.Tk()
text = tk.Text(root, wrap='none')
text.pack(fill='both', expand=True)
# 定义标记
text.tag_config('semicolon', foreground='red')
text.tag_config('plus', foreground='green')
text.tag_config('visible', foreground='black')
text.tag_config('hidden', foreground='white')
text.tag_config('bracket', background='gray')
# 监听文本变化事件
text.bind('<<Modified>>', on_text_changed)
# 定时更新标记
root.after(100, mark_symbols, text)
root.mainloop()
```
这个代码使用了正则表达式来寻找分号和加号,并使用Text widget的tag_add()函数将它们标记为红色和绿色。同时,它在输入大括号时添加了小按钮,并使用Text widget的tag_remove()函数和tag_add()函数来展开或折叠大括号。
希望这个代码可以帮到您,如果您有任何问题请随时问我!