求推荐适用于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
相关产品推荐
相关产品推荐

