Python Pyinstaller MSYS 问题与 PyQtWebKit

Posted

技术标签:

【中文标题】Python Pyinstaller MSYS 问题与 PyQtWebKit【英文标题】:Python Pyinstaller MSYS problem with PyQtWebKit 【发布时间】:2021-07-18 07:52:27 【问题描述】:

web_browser.py

# -*- 编码:utf-8 -*-

# 通过读取 ui 文件 'web_browser.ui' 生成表单实现
#
# 创建者:PyQt5 UI 代码生成器 5.15.2
#
# 警告:当 pyuic5 被安装时,对该文件所做的任何手动更改都将丢失
# 再次运行。除非您知道自己在做什么,否则不要编辑此文件。


从 PyQt5 导入 QtCore、QtGui、QtWidgets


类 Ui_MainWindow(对象):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(779, 257)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
        self.verticalLayout.setContentsMargins(0, 0, 0, 0)
        self.verticalLayout.setSpacing(0)
        self.verticalLayout.setObjectName("verticalLayout")
        MainWindow.setCentralWidget(self.centralwidget)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))


如果 __name__ == "__main__":
    导入系统
    应用程序 = QtWidgets.QApplication(sys.argv)
    MainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(主窗口)
    MainWindow.show()
    sys.exit(app.exec_())

web_browser_main.py

从 web_browser 导入 *
从 PyQt5 导入 QtCore、QtGui、QtWidgets
从 PyQt5.QtCore 导入 QUrl
从 PyQt5.QtWebKitWidgets 导入 QWebView , QWebPage
导入系统
类测试浏览器代码:
    def __init__(self):
        self.app = QtWidgets.QApplication(sys.argv)
        self.mainWindow = QtWidgets.QMainWindow()
        self.main_ui = Ui_MainWindow()
        self.main_ui.setupUi(self.mainWindow)
        self.mainWindow.showMaximized()
        
        self.open_google()
        
        sys.exit(self.app.exec_())
        
    def open_google(自我):
        self.google_url = 'http://www.google.com'
        
        self.main_ui.chat_browser = QWebView()
        self.main_ui.chat_page = QWebPage()
        self.main_ui.chat_browser.setPage(self.main_ui.chat_page)
        self.main_ui.chat_browser.setUrl(QUrl(self.google_url))
        
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)


        self.main_ui.chat_browser.setMinimumSize(QtCore.QSize(0, 398))
        self.main_ui.chat_browser.setMaximumSize(QtCore.QSize(16777215, 398))
        
        
        self.main_ui.chat_browser.setSizePolicy(sizePolicy)
        self.main_ui.chat_browser.setStyleSheet("背景色:白色;边框:1px 纯色#dadada;")
        
        self.main_ui.verticalLayout.addWidget(self.main_ui.chat_browser)
        
        self.main_ui.chat_browser.show()

程序 = TestBrowserCode()
    从源代码运行:
Χρήστος@Chris-pc MINGW64 /c/python/scripts/Papinhio player/notes
$ python web_browser_main.py

(网站显示正确)

    制作 .exe 文件 (full result here)
Traceback(最近一次调用最后一次):
  文件“C:/Python/Scripts/Papinhio player/notes/web_browser_main.py”,第 4 行,在
 
    从 PyQt5.QtWebKitWidgets 导入 QWebView , QWebPage
  _find_and_load 中的文件“”,第 991 行
  文件“”,第 975 行,在 _find_and_load_unlocked
  文件“”,第 657 行,在 _load_unlocked
  文件“”,第 556 行,在 module_from_spec
  文件“”,第 1101 行,在 create_module
  _call_with_frames_removed 中的文件“”,第 219 行
  _find_and_load 中的文件“”,第 991 行
  文件“”,第 973 行,在 _find_and_load_unlocked
ModuleNotFoundError:没有名为“PyQt5.QtWebKit”的模块
[17208] 无法执行脚本 web_browser_main

结果错误导入PyQt5.QtWebKitWidgets

msys2 mingw64 控制台中的所有内容。 如何编译以上文件?

【问题讨论】:

【参考方案1】:
pyinstaller --onefile --hidden-import PyQt5.QtWebKit web_browser_main.py

上面的代码包括缺少的模块 QtWebKit。 我建议使用 --onedir 而不是 --OneFile 因为我认为输出的 exe 更稳定。 (在 web_browser_main 等应用程序中几秒钟后,我遇到了 Segmentfault 运行时错误)

现在工作!!!

【讨论】:

请解释一下代码的作用和它是怎么做的。 @M-Chen-3 做到了

以上是关于Python Pyinstaller MSYS 问题与 PyQtWebKit的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 pyinstaller 创建可独立运行的 QML 地图?

Pyinstaller onefile 可执行文件非常庞大和缓慢

如何在 MSYS2 上安装 Python 开发工具

如何在 MSYS2 中使用 Windows Python 安装

如何在 msys python 中获取本机 Windows 路径?

Python打包方法——Pyinstaller (python3)