PyQt入门(第一个PyQt应用)

  • 作者:rex
  • 分类: Python
  • 时间:2020年8月22日
  • 224人已阅读
简介python GUI框架简介,pyqt介绍

PyQt入门(第一个PyQt应用)

一、PyQt介绍

PyQt是一个创建GUI应用程序的工具包。它是Python编程语言和Qt库的成功融合。Qt库是目前最强大的库之一。PyQt是由Phil Thompson 开发。

PyQt实现了一个Python模块集。它有超过300类,将近6000个函数和方法。它是一个多平台的工具包,可以运行在所有主要操作系统上,包括UNIX,Windows和Mac。 PyQt采用双许可证,开发人员可以选择GPL和商业许可。在此之前,GPL的版本只能用在Unix上,从PyQt的版本4开始,GPL许可证可用于所有支持的平台。

二、python GUI框架简介,pyqt介绍,为什么使用pyqt

python开发GUI程序,了解一个框架需要了解:

(1)运行效果 (2)能够运行在哪些平台 (3)学习成本,因为每一个GUI框架都有自己的特点 (4)开发效率的比较,python的运行效率比c c++低,但是开发效率是比较快的

python GUI框架:

(1)Tkinter: python内置的GUI框架,使用TCL实现,python中内嵌了TCL解释器,使用它的时候不用安装额外的扩展包,直接import,跨平台。不足之处在于UI布局全靠代码实现,只有15种常用部件,显示效果简陋。 (2)Wxpython:用得比较广泛,跨平台,C++编写,需要安装扩展模块;文档少,遇到问题不好解决,代码布局控件,不直观。 (3)Pygtk: python对GTK+GUI库的封装,在linux平台上运行的比较好,需要安装扩展模块,在windows下的兼容性有一些问题。 (4)pyqt:QT原本是诺基亚的产品,源码用C++写的,python对QT的包装,跨平台,本地显示效果,根据系统决定,在win7下就是win7的显示效果;pyqt与qt的函数接口一致,qt开发问的那个丰富,所以pyqt开发文档也比较丰富;控件丰富,函数/方法多,拖曳布局;方便打包成二进制文件;GPL协议,商业程序需要购买商业版授权 (5)pyside:诺基亚的亲儿子,python对QT的封装,安装扩展模块,跨平台,与pyqt的API一样,LGPL协议,新软件可以是私有的,代码布局 (6)Kivy: 针对多点触控程序,智能手机平板等,也可以在没有触屏功能的系统上,全平台支持;使用python和cython(python和c语言的接口)编写;中文支持差,需要自己下载中文库并且制定路径。

为什么使用pyqt:

  1. 因为API与qt一致,学会了pyqt再使用qt很简单
  2. 文档丰富
  3. 学习成本低
  4. 开发迅速,qt designer拖曳布局,如果使用代码布局还需要构建全局并且调试
  5. 学习经验容易迁移到pyside来开发商业应用
  6. 方便打包发布软件,python本身解释语言的特点是写好的程序不编译和链接,使用文本运行解释器,边解释边执行,用户不可能装一个解释器再发源码再执行,所以打包成exe再发布

三、安装与配置

1.安装

安装pyqt5

pip install pyqt5or pip3 install pyqt5

Windows安装PyQt-tools

pip3 install pyqt5-tools

Mac和Linux都不支持PyQt5-tools所以直接安装Qt Designer即可

  • Mac

pip install Qt

  • Linux

注:由于我用的Manjaro已经内置了Qt Designer,所以这里写ubuntu下的安装方法

sudo apt-get install qt5-default qttools5-dev-tools

terminal中查看是否安装成功PyQt

 rex@rex-linux  ~  pip list
Package              Version 
-------------------- --------
appdirs              1.4.3   
btrfsutil            1.1.1   
CacheControl         0.12.5  
chardet              3.0.4   
colorama             0.4.1   
cupshelpers          1.0     
distlib              0.2.9   
distro               1.4.0   
docopt               0.6.2   
html5lib             1.0.1   
idna                 2.8     
Jade-Application-Kit 2.0.7   
keyutils             0.5     
lockfile             0.12.2  
louis                3.10.0  
msgpack              0.6.1   
npyscreen            4.10.5  
numpy                1.16.4  
opencv-python        4.1.0.25
packaging            19.0    
pacman-mirrors       4.14.2  
pep517               0.5.0   
Pillow               6.1.0   
pip                  19.0.3  
progress             1.5     
pwquality            1.4.0   
pycairo              1.18.1  
pycups               1.9.74  
pycurl               7.43.0.2
PyGObject            3.32.2  
pyparsing            2.4.0   
PyQt5                5.13.0  
PyQt5-sip            4.19.18 
pysmbc               1.0.16  
pytoml               0.1.20  
PyYAML               5.1     
reportlab            3.5.23  
requests             2.22.0  
retrying             1.3.3   
setuptools           41.0.1  
six                  1.12.0  
team                 1.0     
udiskie              1.7.7   
urllib3              1.25.3  
webencodings         0.5.1 

如图所示我们已经安装成功了PyQt5

2.配置

若你已经可以在你的应用程序菜单里找到Qt Designer那就可以了

[外链图片转存失败(img-cdK7Yi3o-1563843564530)(https://s2.ax1x.com/2019/07/20/eS1iCT.png)]

PyCharm配置

注:PyCharm安装激活方法自行百度,这里不提供

  • 打开PyCharm
  • File->Setting->Tools->External Tools

[外链图片转存失败(img-TwIbK8xa-1563843564532)(https://s2.ax1x.com/2019/07/20/eS1Uat.png)]

  • 点击加号,依次填入

``` Name:Qt Designer

Group:Qt

Program:usr/local/designer

Arguements:$FileName$

Working directory:$ProjectFileDir$ ```

[外链图片转存失败(img-4xnGka2t-1563843564534)(https://s2.ax1x.com/2019/07/20/eS1wPf.png)]

  • 再次点击加号输入

``` Name:PyUIC

Group:Qt

Program:/usr/bin/python3

Arguements:-m PyQt5.uic.pyuic $FileName$ -o $FileNameWithoutExtension$.py

Working directory:$FileDir$ ```

[外链图片转存失败(img-mSRNAKyo-1563843564535)(https://s2.ax1x.com/2019/07/20/eS38YV.png)]

  • Ok->Apply

到这里PyCharm的配置基本结束

四、第一个PyQt应用程序

1.UI设计

  • 打开PyCharm新建一个基于venv的python项目

  • 在Setting的Project interpreter中查看是否有PyQt没有的话自行添加

[外链图片转存失败(img-QeaQqMLq-1563843564537)(https://s2.ax1x.com/2019/07/20/eS30T1.png)]

  • 打开Tools->QT->Qt Designer

[外链图片转存失败(img-Y2gwr3fs-1563843564538)(https://s2.ax1x.com/2019/07/20/eS3f0A.jpg)]

  • 新建一个MainWindow ui界面

  • 向上拖拉控件并保存名为firstMainWindow.ui

[外链图片转存失败(img-2JMjRxiL-1563843564543)(https://s2.ax1x.com/2019/07/20/eS3qXQ.png)]

2.ui文件转换为.py文件与代码编写和运行

要想.ui文件可以被我们程序读取有两种方法

  • 使用命令行来将.ui编译为.py文件

pyuic5 -o firstMainWindow.py firstMainWindow.ui

编译完成后的firstMainWindow.py文件内容

  from PyQt5 import QtCore, QtGui, QtWidgets


  class Ui_MainWindow(object):
      def setupUi(self, MainWindow):
          MainWindow.setObjectName("MainWindow")
          MainWindow.resize(800, 600)
          self.centralwidget = QtWidgets.QWidget(MainWindow)
          self.centralwidget.setObjectName("centralwidget")
          self.listWidget = QtWidgets.QListWidget(self.centralwidget)
          self.listWidget.setGeometry(QtCore.QRect(140, 60, 531, 371))
          self.listWidget.setObjectName("listWidget")
          MainWindow.setCentralWidget(self.centralwidget)
          self.menubar = QtWidgets.QMenuBar(MainWindow)
          self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 30))
          self.menubar.setObjectName("menubar")
          self.menuFile = QtWidgets.QMenu(self.menubar)
          self.menuFile.setObjectName("menuFile")
          self.menuEdit = QtWidgets.QMenu(self.menubar)
          self.menuEdit.setObjectName("menuEdit")
          MainWindow.setMenuBar(self.menubar)
          self.statusbar = QtWidgets.QStatusBar(MainWindow)
          self.statusbar.setObjectName("statusbar")
          MainWindow.setStatusBar(self.statusbar)
          self.actionNew = QtWidgets.QAction(MainWindow)
          self.actionNew.setObjectName("actionNew")
          self.actionOpen = QtWidgets.QAction(MainWindow)
          self.actionOpen.setObjectName("actionOpen")
          self.menuFile.addAction(self.actionNew)
          self.menuFile.addAction(self.actionOpen)
          self.menubar.addAction(self.menuFile.menuAction())
          self.menubar.addAction(self.menuEdit.menuAction())

          self.retranslateUi(MainWindow)
          QtCore.QMetaObject.connectSlotsByName(MainWindow)

      def retranslateUi(self, MainWindow):
          _translate = QtCore.QCoreApplication.translate
          MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
          self.menuFile.setTitle(_translate("MainWindow", "File"))
          self.menuEdit.setTitle(_translate("MainWindow", "Edit"))
          self.actionNew.setText(_translate("MainWindow", "New"))
          self.actionOpen.setText(_translate("MainWindow", "Open"))
  • 使用代码直接读取.ui文件

这里我们还是依旧两种方法来读取.ui文件

1.使用我们编译好的firstMainWindow.py文件

2.直接读取.ui文件

  • 使用firstMainWindow.py文件

    编写一个叫CallFirstMainWin.py文件,内容如下

    import sys
    from PyQt5.QtWidgets import  QApplication, QMainWindow
    from firstMainWin import *
    class MyMainWindow(QMainWindow, Ui_MainWindow):


        def __init__(self, parent=None):
            super(MyMainWindow, self).__init__(parent)
            self.setupUi(self)


    if __name__ == "__main__":
        app=QApplication(sys.argv)
        myWin = MyMainWindow()
        myWin.show()
        sys.exit(app.exec_())

这里我们继承了firstMainWindow.py中的Ui_MainWindow类来使用我们设计的UI

  • 直接读取.ui文件
    import sys
    from PyQt5.QtWidgets import  QApplication, QMainWindow
    from firstMainWin import *
    from PyQt5.uic import loadUi

    app = QApplication(sys.argv)
    widget = loadUi('firstMainWin.ui')
    widget.show()
    sys.exit(app.exec_())

这里是直接使用了loadUi方法来读取了ui文件

注意:为了保障界面与逻辑分离我们大部分情况下都使用第一种方法,通过继承界面文件的主窗口类来完成界面和逻辑的分离

  • 运行

[外链图片转存失败(img-QziDz2Gz-1563843564545)(https://s2.ax1x.com/2019/07/20/eStTsO.png)]

两种方式都可以成功运行

End

文章评论

Top