You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 11:48:01