pyqt 初步指南



  • 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 FilePathFilePath -o ui_FileNameWithoutExtensionFileNameWithoutExtension. py
      • Working directory:ProjectFileDirProjectFileDir

    界面部分

    1. 在pycharm中打开QT Designer,绘制图形界面。
    2. 在pycharm中选中之前绘制好的ui界面,采用自定义插件Pyuic,将设计师文件(.ui)转化为pyqt可以读取的格式(.py),Pyuic将Sendmail.ui转化为ui_Sendmail.py,并存放在相同的工作目录下

    代码部分

    1. 新建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,并且加载主窗体程序

    1. 新建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.submitclass Login类下的一个函数,在ui界面的按钮pushButton点击时执行,这样就实现了图形界面

    1. app的运行
      python3 main.py

    2. 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
    
    1. 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
    
    1. 部分常用函数(若使用则需导入相应的包)
    file_main, ok = QFileDialog.getOpenFileName(self, "打开", "/temp/", "All Files (*);;Text Files (*.txt)")	# 用于创建文件选择器
    self.ui.lineEdit.setText('xxx')	# 用于设置输入行内容
    title = self.ui.lineEdit.text()	# 用于获取输入行内容
    


  • 这玩意我也做过,我也碰到了pyinstaller打包时候的hidden import的问题😂太巧了


 

Copyright © 2018 bbs.dian.org.cn All rights reserved.

与 Dian 的连接断开,我们正在尝试重连,请耐心等待