最近在学习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