如何在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,提问作者Ξένη Γήινος
相关产品推荐
相关产品推荐

