PyQt5 初体验

经常使用 python 编写一些小工具用具辅助日常工作,平时编写的都是命令行小工具,虽然看起来高大上,但是用起来着实有点不方便,于是就想着给自己编写的小工具加上一个UI

于是就有了这次PyQt5初体验。

环境搭建很简单
python3.6
PyCharm 2020.1 (Community Edition)
PyQt5
pyqt5-tools

窗口未响应

遇到的第一个问题,是在执行程序的时候,窗口会出现未响应的情况,
原来是因为我所有的程序都是在一个线程里面执行的,当某个函数执行时间太长的时候,窗口就会出现未响应的现象。
解决方法:
为函数创建自己的线程。 所以我第一次接触线程编程,这就有了第二个问题,不同的线程之间怎么传递数据。

创建线程

from PyQt5.QtCore import QThread, pyqtSignal  # 导入线程需要的库

class myThread(QThread):  # 定义线程对象

    _signal = pyqtSignal(str)   # 定义线程信号

    def __init__(self, parameter1, parameter2):  # 线程初始化
        self.parameter = parameter1
        pass
    def run(self): # 线程要执行的操作
        self._signal.emit(self.parameter) # 发射信号, 参数要和信号定义中的类型,数量一致

看资料说,PyQt 官方是不推荐直接改写线程的 run 方法的,应该使用 moveToThread 方法,以后在研究。

线程间数据传递

方法一,使用全局变量,不同线程直接操作全局变量,简单,方便。但是这样的话不利于程序模块化,程序复用性会大大降低,有一个词是 不够 Pythonic。
方法二,使用信号,将需要传递的数据通过信号发送出来就可以了,同样很方便,使用起来也更灵活。

窗口间数据传递

这个问题,同样用信号解决了。

关于 tableWidget

要是你添加完数据发现表格没有显示,那可能是因为你没有设置表格的行和列,像这样:

from PyQt5.QtWidgets import QTableWidget, QAbstractItemView  
tableWidget = QTableWidget()  
tableWidget.setRowCount(5)  
tableWidget.setColumnCount(9)  
tableWidget.setEditTriggers(QAbstractItemView.NoEditTriggers)  

urllib.request.urlopen 耗时

有时候这个请求会耗费大量的时间,不知道是服务器的原因,还是程序本身的原因

enter image description here enter image description here

pyinstaller打包

遇到的问题: 在 XP 系统运行时,提示 无法定位程序输入点于 KERNEL32.dll

原因: Python 支持 XP 的最后一个版本是 Python3.4,若果用更高版本的 Python 打包程序,就可能出现这个问题。

解决办法: 更换 Python 版本到 3.4

遇到问题: Python3.4 中无法使用 pip 安装 PyQt5

原因: 提示说找不到指定版本的 sip

解决办法: 使用 exe 安装包安装,只能安装到 Python 安装目录,无法使用虚拟环境

OK!!! 到这里,折腾成功。

python 3.4 已经结束生命周期, XP 也已经不再维护,如果可以,还是不要在折腾兼容 XP 的程序了。