PyQt5

文章描述了在使用PyQt5开发应用并用pyinstaller打包时遇到的两个主要问题:1)打包后的.exe无法运行,原因是PyQt5库未被正确包含;2)导入QtWebEngineWidgets模块失败。解决方法包括指定PyQt5路径,将ui文件转换为py模块,确保所有文件在同一目录下,以及解决DLL导入错误。
摘要由CSDN通过智能技术生成

最近在学习pyqt5, 使用pyqt5的时候出现了一些莫名奇妙的问题,解决之后决定把它记录下来,方面pyqt5的初学者使用。

每个问题会按照如下方式进行描述

1、问题描述:
2、解决方法:

问题1:

使用pyinstaller打包,生成的.exe文件不能运行怎么办?

解决方法:

PyQt5是第三方库,所以在打包的时候默认不会加到.exe文件去,所以需要指定pyqt5的路径。例如:

pyinstaller -p E:\Tools\Anaconda3\envs\py38_qt\Lib\site-packages -F main_calculator.py
Round 1

双击dist下面的.exe文件,但是出现下面问题:(2023.4.29 0:12 深夜了,明天再debug)
在这里插入图片描述
看了一下,是这个文件找不到,我使用的是动态加载ui文件,所以如果打包的话,还是只能静态用uci5将.ui文件打包为.py的文件调用。

---------------------2023.5.2------------------

Round 2

根据上述的排查后,转为静态加载ui文件,即用pyuic5将ui文件转为py模块,然后再main.py中调用该函数。

pyuic5 ./button.ui -o ./button.py

但是打包过后还是不行,会出现点击.exe后闪退的情况。

针对上述问题,解决方法:

我在csdn上找了一些哥们的方法,有个哥们介绍用录视频的方式查看。
我用qq录屏尝试,在cmd中没有任何提示。未遂,继续尝试解决方法。
直到这个哥们介绍的,用cmd窗口打开然后命令行运行.exe文件,而不是双击.exe文件运行。
这个时候出现了提示,No Module name ui_py,已经用静态加载代替动态了,为什么还会出现这样的情况?

针对上述问题,解决方法:

在这里插入图片描述

因为我把main.py和static_cal.py文件放在不同的文件夹下,VsCode运行项目的时候不会把根目录加载到sys.path中,然后我手动用下面的代码将其加入到path中:

import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

但是打包还是出现问题,对于在本地运行没问题,打包他只会加载当前main文件下的文件,所以我将本项目的三个文件.ui 和main.py 和ui转py的三个文件全都放在一个文件夹下p1_cal然后再次打包,成功。
在这里插入图片描述

---------------------2023.5.3------------------

记录一下对PyQt5的认识

如果是用的是绝对布局,也就是直接在类下设定好了窗体的大小和位置,窗体的大小不会随着用户的托大托小而改变。这个时候的代码可以如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import Qt


class CheckBoxDemo(QWidget):

    def __init__(self, parent=None):
        super(CheckBoxDemo, self).__init__(parent)

        groupBox = QGroupBox("Checkboxes")
        groupBox.setFlat(False)

        layout = QHBoxLayout()
        self.checkBox1 = QCheckBox("&Checkbox1")
        self.checkBox1.setChecked(False)
        self.checkBox1.stateChanged.connect(lambda: self.btnstate(self.checkBox1))
        layout.addWidget(self.checkBox1)

        self.checkBox2 = QCheckBox("Checkbox2")
        self.checkBox2.toggled.connect(lambda: self.btnstate(self.checkBox2))
        layout.addWidget(self.checkBox2)

        self.checkBox3 = QCheckBox("tristateBox")
        self.checkBox3.setTristate(True)
        self.checkBox3.setCheckState(Qt.PartiallyChecked)
        self.checkBox3.stateChanged.connect(lambda: self.btnstate(self.checkBox3))
        layout.addWidget(self.checkBox3)

        groupBox.setLayout(layout)
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(groupBox)

        self.setLayout(mainLayout)
        self.setWindowTitle("checkbox demo")

    def btnstate(self, btn):
        chk1Status = self.checkBox1.text()+", isChecked=" + str(self.checkBox1.isChecked()) + \
                ', chekState=' + str(self.checkBox1.checkState()) + "\n"
        chk2Status = self.checkBox2.text()+", isChecked=" + str(self.checkBox2.isChecked()) + \
                ', checkState=' + str(self.checkBox2.checkState()) + "\n"
        chk3Status = self.checkBox3.text()+", isChecked=" + str(self.checkBox3.isChecked()) + \
                ', checkState=' + str(self.checkBox3.checkState()) + "\n"
        print(chk1Status + chk2Status + chk3Status)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    checkboxDemo = CheckBoxDemo()
    checkboxDemo.show()
    sys.exit(app.exec_())

但如果是是用py designer布局后得到ui文件,再转为py文件,那么就需要再定义一个类,该类中需要用到py模块中的函数。
如下:
ui转py文件:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file './ui_ori/calculator.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        ……

    def retranslateUi(self, MainWindow):
		……

main.py文件:

import sys
import os
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
from ui_py.static_cla import Ui_MainWindow
# from ui_py.static_cla import Ui_MainWindow
from PyQt5 import QtWidgets
from PyQt5.QtWidgets import QApplication, QMainWindow,QMessageBox


# static in order to pack up
class Digcalculator(QMainWindow, Ui_MainWindow):
    def __init__(self, parent = None):
        super(Digcalculator, self).__init__()
        self.setupUi(self) # 如果有ui.py的文件的话就用这个 
        self.action() # 存放所有的信号槽
	
	    ……
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = Digcalculator()
    window.show()
    sys.exit(app.exec_())

问题2:

DLL load failed while importing QtWebEngineWidgets: 找不到指定的模块怎么办?

解决方法:

参考网站:StackOverflow
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值