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

求推荐适用于Python非Web聊天程序的代码语法高亮库

推荐的Python语法着色库及实现方案

1. Pygments(通用型语法高亮库)

Pygments是Python生态中最成熟的语法高亮工具,支持数百种编程语言和标记语言,能完美处理转义字符、多行字符串、嵌套注释等手动正则难以覆盖的场景。

适配Qt程序的两种方式:

  • 方式一:生成HTML后用QTextEdit显示
    把代码交给Pygments生成带样式的HTML,直接在QTextEdit中加载即可,无需手动维护高亮规则:

    from pygments import highlight
    from pygments.lexers import PythonLexer
    from pygments.formatters import HtmlFormatter
    
    code = "你的代码文本"
    # 生成带样式的HTML
    formatter = HtmlFormatter(style='default')
    highlighted_html = highlight(code, PythonLexer(), formatter)
    # 获取CSS样式并嵌入HTML
    css = formatter.get_style_defs('.highlight')
    full_html = f"<style>{css}</style>{highlighted_html}"
    # 在QTextEdit中渲染
    text_edit.setHtml(full_html)
    
  • 方式二:将Pygments规则转换为QSyntaxHighlighter规则
    如果想继续沿用QSyntaxHighlighter框架,可以借助Pygments的分词结果生成高亮规则,避免手动写正则的缺陷:

    from pygments.lexers import PythonLexer
    from pygments.token import Token
    from PyQt5.QtGui import QTextCharFormat, QColor, QFont
    
    class PygmentsHighlighter(QSyntaxHighlighter):
        def __init__(self, parent=None):
            super().__init__(parent)
            # 映射Pygments Token到Qt文本格式
            self.token_format_map = {
                Token.Keyword: self._create_format(QColor("blue"), bold=True),
                Token.String: self._create_format(QColor("green")),
                Token.Comment: self._create_format(QColor("gray")),
                Token.Name.Function: self._create_format(QColor("darkorange")),
                Token.Name.Class: self._create_format(QColor("purple"), bold=True),
                # 可根据需求添加更多Token类型的样式
            }
            self.lexer = PythonLexer()
    
        def _create_format(self, color, bold=False):
            fmt = QTextCharFormat()
            fmt.setForeground(color)
            if bold:
                fmt.setFontWeight(QFont.Bold)
            return fmt
    
        def highlightBlock(self, text):
            # 用Pygments对代码分词
            tokens = list(self.lexer.get_tokens(text))
            pos = 0
            for token_type, token_text in tokens:
                length = len(token_text)
                if token_type in self.token_format_map:
                    self.setFormat(pos, length, self.token_format_map[token_type])
                pos += length
    

2. QScintilla(Qt专属高级编辑器组件)

QScintilla是基于Scintilla的Qt绑定组件,内置Python等多种语言的语法高亮、代码折叠、自动补全等功能,完全不需要手动实现高亮逻辑,适合桌面聊天程序的代码展示场景。

基本使用示例:

from PyQt5.Qsci import QsciScintilla, QsciLexerPython

# 创建QScintilla编辑器实例
editor = QsciScintilla()
# 绑定Python语法高亮器
lexer = QsciLexerPython()
editor.setLexer(lexer)
# 自定义样式(可选)
lexer.setColor(QColor("blue"), QsciLexerPython.Keyword)
lexer.setColor(QColor("green"), QsciLexerPython.DoubleQuotedString)
lexer.setColor(QColor("gray"), QsciLexerPython.Comment)
# 设置要展示的代码
editor.setText("你的代码内容")

3. 手动实现的缺陷说明

你当前的正则高亮方案存在以下核心问题,导致效果不佳:

  • 字符串匹配用".*"是贪婪匹配,会把同一行中多个字符串的内容(包括中间的引号)全部匹配成一个字符串;
  • 无法处理转义字符(比如"He said \"Hello\""),会提前截断字符串;
  • 不支持Python的多行字符串("""或'''格式);
  • 无法区分字符串中的#和真正的注释,会误把字符串内的#当成注释高亮。

以上推荐的库均能完美解决这些问题,无需手动维护复杂的正则规则。

内容的提问来源于stack exchange,提问作者Eran Gross

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:35:57