Pyinstaller打包PyQt5踩的坑
在做完一个P站的爬虫后,我决定为之制作一个UI界面,并使用Pyinstaller打包为exe发布。
然后呢,我不出意料的踩了很多坑_(:3」∠)_
原文
首先第一个就是关于Pyinstaller,它会生成两个文件夹(build和dist),其中build是工程文件夹(全是过程文件,没什么卵用),而dist才是最后生成的程序,年少无知的我在build里傻傻得找了很久exe文件。
然后是关于bin检索的问题,PyQt5的一些模块不能正常的被识别,需要-p C:\Python35\Lib\site-packages\PyQt5\Qt\bin
增加检索的目录。
接着是api-ms-win-crt-runtime错误,原本本地编译完运行毫无问题,但是发个一win7-64bit的同学运行后报错dll丢失。 查到简书:
PyInstaller打包之后的程序运行的时候发生api-ms-win-crt-runtime动态库之类的错误,似乎只有在Python 3.5下打包才会遇到。 因为Universal CRT(KB2999226)缺失,可以通过安装此更新来解决问题。 或者直接下载 Visual C++ Redistributable (x86 ,x64 )。
最后遇到的是在PyQt5中使用的ico文件不能正常的打包如exe,最后pyrcc5解决,使用命令
pyrcc5 -o images.py images.qrc
images.qrc代码如下:
<RCC>
<qresource prefix="/" >
<file>img/image1.png</file>
<file>img/image2.png</file>
<file>img/image3.png</file>
</qresource>
</RCC>
最后将import images
,使用例如':/img/image1.png'
引用即可。这个方法同样来自简书
正月初一更新
最近又发现了一个把资源文件打包进exe里的方法,在spec文件里a.datas,
下一行加上行[(filename,filepath,'DATA')],
即可。
这个方法最好的地方是可以用来打包-i参数加入的图标文件。
接下来想要做的是做个进度条,当然要先结果目前一阻塞窗口就未响应的问题······
正月初三更新
今天解决了之前的两大问题,使用QThread来保证UI不被阻塞。需要建立一个类继承QtCore.QThread
然后重写run()函数
1 class myQThread(QtCore.QThread):
2 done = QtCore.pyqtSignal()
3 def __init__(self):
4 super(myQThread, self).__init__()
5 self.mod = ''
6
7 def run(self):
8 time.sleep(1)
9 self.done.emit()
10
11 AQThread = myQThread()
12 AQThread.start()
13 AQThread.done.connect(donefun)
为了解决进度条的问题修改了之前的爬取内核,所以把新的版本就改为Ver.2.1~
1 class dw(QWidget):
2 def __init__(self):
3 super(dw, self).__init__()
4 self.timer = QtCore.QBasicTimer()
5
6 def timerEvent(self, e):
7 dosomething()
8
9 w = dw()
10 w.show()
11 w.timer.start(100, w)
以上代码重写了timeEvent函数,当计时器超时就会触发该函数,然后重绘ui,达到进度条等动态效果。
转战Android,脚本保持维护,GUI版本不准备再更新了。
Pixiv-2.1-GUI
Password: 1c3e