以下是对上述较早的答案中提出的解决方案PySide2和python3.6+的改编:from PySide2 import QtWidgets
from pyside2uic import compileUi
from xml.etree import ElementTree
from io import StringIO
def loadUiType(design):
"""
PySide2 equivalent of PyQt5's `uic.loadUiType()` function.
Compiles the given `.ui` design file in-memory and executes the
resulting Python code. Returns form and base class.
"""
parsed_xml = ElementTree.parse(design)
widget_class = parsed_xml.find('widget').get('class')
form_class = parsed_xml.find('class').text
with open(design) as input:
output = StringIO()
compileUi(input, output, indent=0)
source_code = output.getvalue()
syntax_tree = compile(source_code, filename='', mode='exec')
scope = {}
exec(syntax_tree, scope)
form_class = scope[f'Ui_{form_class}']
base_class = eval(f'QtWidgets.{widget_class}')
return (form_class, base_class)
如果与主Python模块一起另存为uic.py,则只有import语句需要更改,以便将问题中的示例从PySide2迁移到PyQt5:
^{pr2}$
在Windows10(通过pip install pyside2)和ManjaroLinux18.0.4(通过pacman-packagespyside2和pyside2-tools)上用python3.7.3和PySide2进行了测试。在
(如果新潮的f-string虽然很漂亮,却被可怕的落后的前辈随意取代,那么这个解决方案也应该适用于旧版的python3版本。)