You need to enable JavaScript to run this app. 如何在PyQt的QMessageBox的HTML+CSS字符串中插入动态字符串列表?
优惠活动
大模型
产品
解决方案
定价
更多

如何在PyQt的QMessageBox的HTML+CSS字符串中插入动态字符串列表?

问题根源

  • 使用format方法报错:CSS规则中的{、}会被Python的format方法识别为占位符边界,和你自定义的{0}~{8}变量占位符冲突,进而触发KeyError。
  • 使用%运算符插值报错:HTML属性中的25%里的%会被识别为格式符前缀,后续的"不是合法的格式字符,因此触发ValueError。
  • 额外的渲染错误:你传入的是HTML内容,但将文本格式设为了MarkdownText,会导致样式无法正常渲染;另外table标签的属性写法错误,<table "cellpadding=3">需要修正为<table cellpadding="3">。

解决方案

有两种可行实现方式,推荐第一种写法更清晰易维护:

方案1:转义CSS的大括号,继续使用format方法

把CSS代码中所有的{替换为{{、}替换为}},同时修正格式设置和标签错误即可,修正后的完整可运行代码如下:

from PyQt6.QtCore import *
from PyQt6.QtGui import *
from PyQt6.QtWidgets import *

app = QApplication([])
message = QMessageBox()

# 动态生成的填充变量列表,可根据业务需求自行替换
fill_data = ["1", "<b> NOT equals </b>", "Electus", "1", "<b> NOT equals </b>", "Temple of Light", "1", "<b> NOT equals </b>", "Temple of Light"]

message.setText(
'<html><body>' \
'检测到输入名称与查询获取的名称存在差异' \
'    <p align="center">比对结果:</p>' \
'    <style>' \
'    table {{' \
'               border-width: 2px;' \
'               border-style: groove;' \
'               border-color: #4080c0;' \
'               border-radius: 4px;' \
'               background: #202020;' \
'               color: #00aeef;' \
'           }}' \
'    </style>' \
'    <table cellpadding="3">' \
'        <tr>' \
'            <td width="25%">字段</td>' \
'            <td width="25%">输入值</td>' \
'            <td width="25%">比对结果</td>' \
'            <td width="25%">查询值</td>' \
'        </tr>' \
'        <tr>' \
'            <td width="25%">艺术家</td>' \
'            <td width="25%"><b><i>{0}</b></i></td>' \
'            <td width="25%">{1}</td>' \
'            <td width="25%"><b><i>{2}</b></i></td>' \
'        </tr>' \
'        <tr>' \
'            <td width="25%">专辑</td>' \
'            <td width="25%"><b><i>{3}</b></i></td>' \
'            <td width="25%">{4}</td>' \
'            <td width="25%"><b><i>{5}</b></i></td>' \
'        </tr>' \
'        <tr>' \
'            <td width="25%">曲目名称</td>' \
'            <td width="25%"><b><i>{6}</b></i></td>' \
'            <td width="25%">{7}</td>' \
'            <td width="25%"><b><i>{8}</b></i></td>' \
'        </tr>' \
'    </table>' \
'你是否确认提交的信息正确?' \
'</body></html>'.format(*fill_data)
)
message.setStandardButtons(QMessageBox.StandardButton.Ok)
# 需设置为富文本格式才能正常解析HTML和CSS样式
message.setTextFormat(Qt.TextFormat.RichText)
message.exec()

如果需要保留原来的英文提示文字,只转义大括号即可,不需要修改文本内容。

方案2:转义HTML中的百分号,使用%运算符插值

如果你更习惯用%做字符串插值,只需要把所有HTML属性里的%替换为%%即可,比如把width="25%"改为width="25%%"。


内容的提问来源于stack exchange,提问作者Ξένη Γήινος

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 19:24:02