如何在Tkinter的ScrolledText组件中将指定词语设置为红色高亮
实现tkinter ScrolledText组件关键词高亮的方案
ScrolledText是tkinter Text组件的子类,完全支持tag样式配置,不需要手动计算字符区间,通过正则匹配即可自动获取所有关键词的起止位置,批量实现高亮效果。
实现步骤
- 第一步:初始化ScrolledText时提前配置高亮tag,可自定义颜色、加粗效果
from tkinter.scrolledtext import ScrolledText # 实例化ScrolledText后配置高亮标签 st = ScrolledText(root) # 示例配置:红色+加粗,可自行修改颜色、字体参数 st.tag_config("keyword_highlight", foreground="red", font=(None, None, "bold"))
- 第二步:编写通用高亮工具函数,自动匹配所有关键词位置
import re def highlight_keywords(text_widget, keyword_list): # 先清空所有旧的高亮标签,避免重复标记 text_widget.tag_remove("keyword_highlight", "1.0", "end") # 获取全文内容 content = text_widget.get("1.0", "end-1c") # 遍历所有待高亮关键词 for kw in keyword_list: kw = kw.strip() if len(kw) == 0: continue # 正则匹配规则:默认不区分大小写,如需全词匹配(避免is匹配到this的is)可替换为下行注释代码 # pattern = re.compile(rf"\b{re.escape(kw)}\b", re.IGNORECASE) pattern = re.compile(re.escape(kw), re.IGNORECASE) # 遍历所有匹配到的关键词 for match in pattern.finditer(content): # 转换为Text组件识别的索引格式 start_idx = f"1.0 + {match.start()} chars" end_idx = f"1.0 + {match.end()} chars" # 给匹配区间添加高亮标签 text_widget.tag_add("keyword_highlight", start_idx, end_idx)
- 第三步:在现有业务函数中调用高亮函数即可,修改后的
checkval参考如下:
import html PLACEHOLDER = "请输入内容" # 替换为你自己的占位符内容 def checkval(e, spec0, spec1, spec2, spec3, spec4, spec5): e.widget.insert("1.0", PLACEHOLDER if e.widget.get("1.0", "end-1c") == "" else "") reqlidst=(spec0, spec1, spec2, spec3, spec4, spec5) textlabl="" for x in reqlidst: if len(x)>1: if x.upper() in e.widget.get("1.0", "end-1c").upper(): if len(textlabl)>1: textlabl = textlabl + "- " + x.replace(" ", "").upper() + " " + html.unescape('✔')+"\n\n" else: textlabl = "- " + x.replace(" ", "").upper() + " " + html.unescape('✔')+"\n\n" else: if len(textlabl) > 1: textlabl =textlabl + "- " + x.replace(" ", "").lower() + " " + html.unescape('✘')+"\n\n" else: textlabl = "- " + x.replace(" ", "").lower() + " " + html.unescape('✘')+"\n\n" e.widget.my_var_expected.set(textlabl) # 新增:调用高亮函数,e.widget为当前ScrolledText组件 highlight_keywords(e.widget, reqlidst)
内容的提问来源于stack exchange,提问作者mclogan
相关产品推荐
相关产品推荐

