狗儿

热爱的话就坚持吧~

0%

PyQt5真香啊

  今天凌晨写了一篇决定弃用PyQt5的文章,但是最终还是含着眼泪说出真香两个字。

  主要是在研究如何在基于c++的QT中调用python程序时,发现了一个问题:变量的传递。还不知道如何解决,但是我感觉一定很麻烦。变量少一点还好,分别将二者的输入输出重定向至同一个文件(或是一个内存地址处?),然后读取这个文件就行了。但变量很多时怎么办?想不明白。

  最后又读了一下《PyQt5快速开发与实战电子书》,特别是看了下书中的pyqt5和pyqt5-tools的版本,尝试着解决一下。

  上一篇文章提到了打包过程中各种乱七八糟的坑,下面就说说我是怎么解决的吧。

  首先,保证环境的干净,建议安装win10虚拟机(win7的虚拟机要安装python需要先更新系统,刚装好的虚拟机太过纯净,缺少几个重要的win7系统更新),然后只安装Python3.7,注意x86还是x64

  然后安装PyQt5 5.9和pyqt5-tools 5.9.2.1.3

img

pip install PyQt5==5.9 -i https://pypi.douban.com/simple

pip install PyQt5-tools==5.9.2.1.3 -i https://pypi.douban.com/simple

  然后pip安装pyinstaller,我安装的是最新版3.5

  然后cmd进入目录下,对入口程序gui.py使用

pyinstller -F -w gui.py

  -w是生成程序窗口而不是cmd黑框,-F是形成一个exe文件而不是一大堆的文件

  然后在目录下生成了文件夹build、dist和文件***.spec,打开dist文件夹,发现了exe程序,可以单独使用,而不依赖与build文件夹内的那些文件。

  不过需要注意的是,64位python下打包生成的exe文件仅能在64位机子下使用。如果有32位的需求,可以安装32位python,然后打包(32位程序可以以兼容的模式在64位机子下运行)

img

  不过还是有点大,我再精简一下导入的包

img

2019.10.20

最近一直在写typecho的微型客户端,今天刚收尾。

文本框掩码在PyQt5==5.9的bug

1571579229909

在这里说一下文本框掩码的bug。本机win10 X64 & PyQt5==5.11.3下无bug,但是当在win10 x86 & PyQt5==5.9下出现问题了(打包之前就有问题了,而不是打包的锅)。

bug具体为:输入数据遇到分隔符时,光标在分隔符上,但是此时输入一个字符却显示在分隔符的下一位处。这不是bug,bug在于紧接着,光标移动一位,到达分隔符的下一处,但是此处已经在上一步中输入了一个字符,此时光标在此处,再次输入数据会覆盖刚刚输入的数据。

首先怀疑x86和x64平台不同的缘故,但是本机更换为PyQt5==5.9后也出现了同样的问题,说明是PyQt5==5.9的bug。

然后虚拟机PyQt5==5.11.3,bug得到修复。

(PyQt5-tools==5.9.2.1.3不变)

PyQt5==5.11.3时的打包

然后打包时出现了好几个warning,但是最终还是打包成功了,似乎没影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
PS C:\Users\kljxn\Desktop\typecho_desktop> pyinstaller -i typecho.ico -F -w main.py
108 INFO: PyInstaller: 3.5
108 INFO: Python: 3.7.5
108 INFO: Platform: Windows-10-10.0.17763-SP0
108 INFO: wrote C:\Users\kljxn\Desktop\typecho_desktop\main.spec
108 INFO: UPX is not available.
108 INFO: Extending PYTHONPATH with paths
['C:\\Users\\kljxn\\Desktop\\typecho_desktop',
'C:\\Users\\kljxn\\Desktop\\typecho_desktop']
108 INFO: checking Analysis
108 INFO: Building Analysis because Analysis-00.toc is non existent
108 INFO: Initializing module dependency graph...
108 INFO: Initializing module graph hooks...
108 INFO: Analyzing base_library.zip ...
4734 INFO: running Analysis Analysis-00.toc
4734 INFO: Adding Microsoft.Windows.Common-Controls to dependent assemblies of final executable
required by c:\users\kljxn\appdata\local\programs\python\python37-32\python.exe
5327 INFO: Caching module hooks...
5343 INFO: Analyzing C:\Users\kljxn\Desktop\typecho_desktop\main.py
5687 INFO: Processing pre-safe import module hook urllib3.packages.six.moves
8125 INFO: Loading module hooks...
8125 INFO: Loading module hook "hook-certifi.py"...
8125 INFO: Loading module hook "hook-encodings.py"...
8233 INFO: Loading module hook "hook-pydoc.py"...
8233 INFO: Loading module hook "hook-PyQt5.py"...
8421 INFO: Loading module hook "hook-PyQt5.QtCore.py"...
8874 INFO: Loading module hook "hook-PyQt5.QtGui.py"...
9546 INFO: Loading module hook "hook-PyQt5.QtWidgets.py"...
10499 INFO: Loading module hook "hook-xml.py"...
10640 INFO: Looking for ctypes DLLs
10640 INFO: Analyzing run-time hooks ...
10640 INFO: Including run-time hook 'pyi_rth_pyqt5.py'
10640 INFO: Including run-time hook 'pyi_rth_certifi.py'
10656 INFO: Looking for dynamic libraries
16874 INFO: Looking for eggs
16874 INFO: Using Python library c:\users\kljxn\appdata\local\programs\python\python37-32\python37.dll
16874 INFO: Found binding redirects:
[]
16890 INFO: Warnings written to C:\Users\kljxn\Desktop\typecho_desktop\build\main\warn-main.txt
16999 INFO: Graph cross-reference written to C:\Users\kljxn\Desktop\typecho_desktop\build\main\xref-main.html
17015 INFO: checking PYZ
17015 INFO: Building PYZ because PYZ-00.toc is non existent
17015 INFO: Building PYZ (ZlibArchive) C:\Users\kljxn\Desktop\typecho_desktop\build\main\PYZ-00.pyz
17890 INFO: Building PYZ (ZlibArchive) C:\Users\kljxn\Desktop\typecho_desktop\build\main\PYZ-00.pyz completed successfully.
17921 INFO: checking PKG
17921 INFO: Building PKG because PKG-00.toc is non existent
17921 INFO: Building PKG (CArchive) PKG-00.pkg
18296 WARNING: One binary added with two internal names.
18312 WARNING: ('libGLESv2.dll',
'C:\\users\\kljxn\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\PyQt5\\Qt\\bin\\libGLESv2.dll',
'BINARY')
18312 WARNING: was placed previously at
18312 WARNING: ('PyQt5\\Qt\\bin\\libGLESv2.dll',
'C:\\users\\kljxn\\appdata\\local\\programs\\python\\python37-32\\lib\\site-packages\\PyQt5\\Qt\\bin\\libGLESv2.dll',
'BINARY')
27015 INFO: Building PKG (CArchive) PKG-00.pkg completed successfully.
27015 INFO: Bootloader c:\users\kljxn\appdata\local\programs\python\python37-32\lib\site-packages\PyInstaller\bootloader\Windows-32bit\runw.exe
27015 INFO: checking EXE
27015 INFO: Building EXE because EXE-00.toc is non existent
27015 INFO: Building EXE from EXE-00.toc
27030 INFO: Copying icons from ['typecho.ico']
27030 INFO: Writing RT_GROUP_ICON 0 resource with 20 bytes
27030 INFO: Writing RT_ICON 1 resource with 67624 bytes
27030 INFO: Updating manifest in C:\Users\kljxn\AppData\Local\Temp\tmpxz_9ammu
27030 INFO: Updating resource type 24 name 1 language 0
27046 INFO: Appending archive to EXE C:\Users\kljxn\Desktop\typecho_desktop\dist\main.exe
27187 INFO: Building EXE from EXE-00.toc completed successfully.

需要说明的是,在修复文本框掩码的bug之前(即PyQt5==5.9时),打包时也出现了一个warning,但是同样也没影响打包结果。

failed to execute script main

1571578584558

之前写校园网登录器的时候最烦这个东西,当时以为是打包出的错。

但是,今天多次尝试,终于明白这是个什么东西了。

翻译:执行脚本main失败

明白了吧。只要是主程序出错,都会弹出这个窗口。

并不是打包的锅哦。

今天遇到多次此对话框,出现的错误原因有:

  • 没有配置文件,程序无法初始化。

  • 配置文件中缓存路径为D盘文件夹,但是虚拟机只有C盘

1571579068422

  • json读取出错。在win10 x86的虚拟机中,每当修改配置文件时,都会自动加上BOM头。导致

1571579003284

上面的报错是我运行main.py的结果。打包后看不到这些错误信息,只能看到 failed to execute script main,不头大才怪嘞。

总之,以后再出现这个对话框,不妨再测试测试程序,而不要再怪罪pyinstaller了。

PyQt-sip问题

提示缺少这个东西,我就安装了,具体不清楚不安装有什么后果。留待以后再探讨吧。

今天的环境

1571579560865

成果

1571579802653