pyqt 初步指南
介绍
PyQt5是一套绑定Qt5的应用程序框架,是作为一套Python模块实现的,能实现代码的图形化。它能运行在所有主流操作系统上,包括Unix,Windows和Mac OS。项目组中的部分任务可以通过pyqt来解决(比如快速打标。。)
版本与自定义插件
运行环境
- System:Mac OS X
- Python:3.6.4
- PyInstaller: 3.4
- QT:pyqt5
自定义插件配置:
采用pycharm进行pyqt的开发,Preference->Tools->External Tools新增插件
- QT Designer:
- Program:/Users/xxx/Qt5.10.1/5.10.1/clang_64/bin/Designer.app
- Working directory:/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/site-packages/PyQt5/Qt/lib/QtDesigner.framework/Versions/d
- Pyuic:
- Program:/usr/local/bin/python3.6
- Arguments:-m PyQt5.uic.pyuic
-o ui_ . py - Working directory:
界面部分
- 在pycharm中打开QT Designer,绘制图形界面。
- 在pycharm中选中之前绘制好的ui界面,采用自定义插件Pyuic,将设计师文件(.ui)转化为pyqt可以读取的格式(.py),Pyuic将Sendmail.ui转化为ui_Sendmail.py,并存放在相同的工作目录下
代码部分
- 新建main.py,写入如下代码:
import sys
import MainWindow
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
mainwindow = MainWindow.Login()
sys.exit(app.exec_())
该代码将创建一个app,并且加载主窗体程序
- 新建MainWindow.py,写入如下代码初始化:
from ui_SendMail import Ui_MainWindow # 引入窗体类
class Login(QMainWindow):
def __init__(self, parent = None):
super(Login, self).__init__(parent)
self.ui = Ui_MainWindow() # 绑定ui文件
self.ui.setupUi(self)
self.ui.pushButton.clicked.connect(self.submit)
self.show() # 显示界面
def submit(self):
pass
qt信号槽机制:由信号和槽函数组成,通过self.ui.connect()进行绑定,在信号发送时可以执行槽函数,如pushButton.clicked
是一个信号,self.submit
是class Login
类下的一个函数,在ui界面的按钮pushButton
点击时执行,这样就实现了图形界面
-
app的运行
python3 main.py -
pyqt多线程编程
若将所有函数写在Login类下,当函数中出现比较耗时的操作时,函数的执行将阻碍ui界面的刷新,故必须采用线程分离的办法解决。即将部分操作写入一个新的class中,作为ui的子线程进行调用,线程之间通过pyqtSignal进行通信
- 引入pyqtSignal:
from PyQt5.QtCore import pyqtSignal
- 创建子线程:
在Login.__init__()
中加入如下代码:
self.thread = Runthread() # 创建子线程
self.thread._signal.connect(self.callbacklog) # 绑定回调信号与回调函数
- 编写子线程代码:
class Runthread(QtCore.QThread):
_signal = pyqtSignal(int, int) # 创建一个回调信号
def __init__(self):
super(Runthread, self).__init__()
def __del__(self):
self.wait()
def set_all(self):
pass
- 编写子线程回调函数,实现线程之间的通信:
class Login(QMainWindow):
...
def callbacklog(self):
# do something
- pyinstaller打包
pyinstaller -F -w main.py
其中-F表示打包成单一文件,-w表示程序执行时无命令行(不适合调试)
- 当Mac下采用-Fw模式打包时,若出现界面分辨率较低时,在app中的info.plist中加入
<key>NSHighResolutionCapable</key>
<true/>
- 当运行时出现类似于ImportError: C extension: No module named ‘pandas._libs.tslibs.timedeltas’时(版本3.3.1可能出现),在打包命令的末尾加上如下代码
--hidden-import=pandas._libs.tslibs.timedeltas
- 部分常用函数(若使用则需导入相应的包)
file_main, ok = QFileDialog.getOpenFileName(self, "打开", "/temp/", "All Files (*);;Text Files (*.txt)") # 用于创建文件选择器
self.ui.lineEdit.setText('xxx') # 用于设置输入行内容
title = self.ui.lineEdit.text() # 用于获取输入行内容