Tkinter Text组件标记重力疑问:插入文本未显红色
问题原因分析
你遇到的问题核心是对Tkinter中Tag和Mark的关系理解有误:
Tag是静态的文本范围绑定:当执行
tt.tag_add('red', 'redLeft', 'redRight')时,只是将red标签应用到当前两个mark之间的文本区间,这个操作是一次性的——后续mark位置变化或插入新文本,不会自动扩展已有的tag范围。Mark的重力仅影响自身位置:设置
redLeft的重力为left、redRight为right,只会让插入文本时mark的位置按规则移动:- 在
redLeft左侧插入文本时,redLeft会保持在原字符的左侧(不会被新文本挤到右边) - 在
redRight左侧插入文本时,redRight会保持在原字符的右侧(新文本会被放在redRight左边)
但这只是改变mark的位置,不会自动让新插入的文本被已有的red标签覆盖。
- 在
解决方法
要让新插入的文本自动归入red标签范围,你需要手动维护tag的范围,或者通过事件绑定自动更新:
方法1:插入后手动更新tag
每次插入文本后,重新将tag应用到当前mark之间的范围:
# insertions after, in and before red text tt.insert('1.6', 'should be red ?') tt.tag_add('red', 'redLeft', 'redRight') # 更新tag范围 tt.insert('1.4', 'is red') tt.tag_add('red', 'redLeft', 'redRight') # 更新tag范围 tt.insert('1.2', 'should be red ?') tt.tag_add('red', 'redLeft', 'redRight') # 更新tag范围
方法2:绑定事件自动维护
通过绑定文本组件的<<Modified>>事件,每次文本修改后自动重置tag范围:
def update_tag(event): if tt.edit_modified(): tt.tag_remove('red', '1.0', tk.END) # 移除原有tag tt.tag_add('red', 'redLeft', 'redRight') # 重新绑定到当前mark范围 tt.edit_modified(False) # 重置修改标记 tt.bind('<<Modified>>', update_tag)
这样无论在哪里插入文本,只要处于redLeft和redRight之间的内容,都会被自动标记为红色。
内容的提问来源于stack exchange,提问作者quietnsos
相关产品推荐
相关产品推荐

