当前位置: 移动技术网 > IT编程>脚本编程>Python > PyQt完整入门教程

PyQt完整入门教程

2020年03月14日  | 移动技术网IT编程  | 我要评论

超品透视,小伙时代微电影,中石油王立新

1、gui开发框架简介

19年来,一直在做android rom相关测试,也有了一定的积累;20年,计划把之前完整的测试方案、脚本、工具进行整合复用。
第一期计划是开发一个gui的测试工具,近期也进行了相关调研。

1.1 通用开发框架

  • electorn:基于node-js,跨平台,开发成本低,运行效率低
  • qt:基于c++,跨平台,效率高,开发成本高
  • javafx:基于java,主要用于跨平台桌面程序开发
  • flutter:基于dart语言,谷歌开源移动ui框架,可以快速在ios和android上构建高质量的原生用户界面

1.2 python方案

  • pyqt:pyqt5是qt v5的python版本,功能强大复杂,提供qt designer设计ui (gpl v3协议,开源,商用收费)
  • pyside: pyside2是来自qt for python项目的官方python模块 (lgpl协议,闭源商用)
  • tkinter:python标准库,tk gui 工具包的接口 ,布局通过代码实现,简单易用,但开发效率低
  • wxpython:开源免费,提供wxformbuilder,压缩版pyqt

因为现有脚本绝大多数是基于python开发,同时调研了上述框架的官方支持力度及网络资料丰富程度,最终还是选用了最流行最强大的pyqt

本文主要详细介绍下pyqt5完整入门教程,包含环境配置,使用qt disinger设计ui,最终完成一个天气预报的gui实例开发。

环境为:windows 10 + python 3.8 + pycharm 2019.2

2、pyqt环境配置

2.1 pyqt5 及 pyqt5-tools 安装

pyqt当前最新版本为pyqt5 5.14.1

直接pip安装即可:

pip install pyqt5
pip install pyqt5-tools

建议使用国内源,进行快速安装:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5-tools

2.2 pycharm配置环境

启动pycharm后,新建一个pyqt5空项目后,需要配置qt designer、pyuic、pyrcc工具,相关配置方法如下:

2.2.1 qt designer

qt designer 是通过拖拽的方式放置控件,并实时查看控件效果进行快速ui设计。

最终生成.ui文件(实质上是xml格式的文件),可以通过pyuic5工具转换成.py文件。

在pycharm中,依次打开 file - settings - tools - external tools,点击 + create tool,配置如下:

name: qtdisigner
program : c:\python38\lib\site-packages\pyqt5_tools\qt\bin\designer.exe # 当前designer目录,请根据实际修改
working directory: $filedir$

2.2.2 qt designer 汉化

默认qt designer是英文版的,可以使用翻译文件进行汉化,下载地址:百度网盘,提取码:kxvx

下载文件 designer_zh_cn.qm后, 拷贝至本地pyqt5_tools的translations文件夹下即可,示例目录:

c:\python38\lib\site-packages\pyqt5_tools\qt\bin\translations

在pycharm主界面,依次点击 tools - external tools - qtdisigner,即可启动中文界面的qt disigner

2.2.3 pyuic配置

pyuic主要是把qt designer生成的.ui文件换成.py文件。

在pycharm中,依次打开 file - settings - tools - external tools,点击 + create tool,配置如下:

name: pyuic
program : c:\python38\python.exe # 当前python目录,请根据实际修改
arguments: -m pyqt5.uic.pyuic $filename$ -o $filenamewithoutextension$.py
working directory: $filedir$

2.2.4 pyrcc配置

pyrcc主要是把编写的.qrc资源文件换成.py文件。

在pycharm中,依次打开 file - settings - tools - external tools,点击 + create tool,配置如下:

name: pyrcc
program : c:\python38\scripts\pyrcc5.exe # 当前rcc工具目录,请根据实际修改
arguments: $filename$ -o $filenamewithoutextension$_rc.py
working directory: $filedir$

3、实例开发

下面我们以一个简单的城市天气预报为例,演示使用pyqt5开发一个gui程序的基本流程。

3.1 获取天气数据

主要逻辑是通过http接口调用免费的api接口获取相关城市天气数据,详见天气api说明

如测试一下请求天津的天气,链接为:

返回成功状态(status)为:200 ,失败为非200,返回数据为json数据,直接解析获取即可。

3.1 设计界面ui

打开qt designer,可参考下图设计weather.ui:

我们主要用到的控件有button, groupbox, label,combobox,textedit,同时定义了两个按钮querybtn及clearbtn,分别用来查询及清空天气数据。我们需要绑定槽函数,方法如下:

1) 在qt designer右下角选择 信号/槽编辑器,点击+号新增
2) 分别选择querybtn及clearbtn,选择信号 clicked(), 接收者 dialog 及槽 accept() (我没找到绑定自定义槽函数的方法...)

最后选择保存为 weather.ui文件。

3.2 转换.ui文件为.py文件

在pycharm中选中weather.ui文件后,右键选择 external tools - pyuic,即可生成weather.py,实际运行命令如下:

c:\python38\python.exe -m pyqt5.uic.pyuic weather.ui -o weather.py

其中,我们需要把两个按钮绑定的槽函数:

        self.querybtn.clicked.connect(dialog.accept)
        self.clearbtn.clicked.connect(dialog.accept)

修改为自定义函数:

        self.querybtn.clicked.connect(dialog.queryweather)
        self.clearbtn.clicked.connect(dialog.cleartext)

最终weather.py内容如下:

# -*- coding: utf-8 -*-

# form implementation generated from reading ui file 'weather.ui'
#
# created by: pyqt5 ui code generator 5.13.2
#
# warning! all changes made in this file will be lost!


from pyqt5 import qtcore, qtgui, qtwidgets


class ui_dialog(object):
    def setupui(self, dialog):
        dialog.setobjectname("dialog")
        dialog.resize(400, 300)
        self.groupbox = qtwidgets.qgroupbox(dialog)
        self.groupbox.setgeometry(qtcore.qrect(0, 0, 391, 241))
        self.groupbox.setobjectname("groupbox")
        self.textedit = qtwidgets.qtextedit(self.groupbox)
        self.textedit.setgeometry(qtcore.qrect(20, 50, 351, 181))
        self.textedit.setobjectname("textedit")
        self.combobox = qtwidgets.qcombobox(self.groupbox)
        self.combobox.setgeometry(qtcore.qrect(100, 20, 91, 20))
        self.combobox.setobjectname("combobox")
        self.combobox.additem("")
        self.combobox.additem("")
        self.combobox.additem("")
        self.label = qtwidgets.qlabel(self.groupbox)
        self.label.setgeometry(qtcore.qrect(30, 20, 61, 21))
        self.label.setobjectname("label")
        self.querybtn = qtwidgets.qpushbutton(dialog)
        self.querybtn.setgeometry(qtcore.qrect(40, 250, 75, 23))
        self.querybtn.setmaximumsize(qtcore.qsize(75, 16777215))
        self.querybtn.setobjectname("querybtn")
        self.clearbtn = qtwidgets.qpushbutton(dialog)
        self.clearbtn.setgeometry(qtcore.qrect(250, 250, 75, 23))
        self.clearbtn.setmaximumsize(qtcore.qsize(75, 16777215))
        self.clearbtn.setobjectname("clearbtn")
        
        self.retranslateui(dialog)
        self.querybtn.clicked.connect(dialog.queryweather)
        self.clearbtn.clicked.connect(dialog.cleartext)
        qtcore.qmetaobject.connectslotsbyname(dialog)
    
    def retranslateui(self, dialog):
        _translate = qtcore.qcoreapplication.translate
        dialog.setwindowtitle(_translate("dialog", "dialog"))
        self.groupbox.settitle(_translate("dialog", "城市天气预报"))
        self.combobox.setitemtext(0, _translate("dialog", "北京"))
        self.combobox.setitemtext(1, _translate("dialog", "上海"))
        self.combobox.setitemtext(2, _translate("dialog", "天津"))
        self.label.settext(_translate("dialog", "城市"))
        self.querybtn.settext(_translate("dialog", "查询"))
        self.clearbtn.settext(_translate("dialog", "清空"))

3.3 调用maindialog

在maindialog中调用界面类ui_dialog,然后在其中中添加查询天气的业务逻辑代码,这样就做到了界面显示和业务逻辑的分离。

新增demo.py文件, 在maindialog类中定义了两个槽函数queryweather()和cleartext(),以便在界面文件weather.ui中定义的两个按钮(querybtn 和clearbtn) 触发clicked 信号与这两个槽函数进行绑定。

完整代码如下:

# coding:utf-8

import sys
import weather
from pyqt5.qtwidgets import qapplication, qdialog
import requests


class maindialog(qdialog):
    def __init__(self, parent=none):
        super(qdialog, self).__init__(parent)
        self.ui = weather.ui_dialog()
        self.ui.setupui(self)
    
    def queryweather(self):
        cityname = self.ui.combobox.currenttext()
        citycode = self.getcode(cityname)
        
        r = requests.get("http://t.weather.sojson.com/api/weather/city/{}".format(citycode))
        
        print(r.json())
        
        if r.json().get('status') == 200:
            weathermsg = '城市:{}\n日期:{}\n天气:{}\npm 2.5:{} {}\n温度:{}\n湿度:{}\n风力:{}\n\n{}'.format(
                r.json()['cityinfo']['city'],
                r.json()['data']['forecast'][0]['ymd'],
                r.json()['data']['forecast'][0]['type'],
                int(r.json()['data']['pm25']),
                r.json()['data']['quality'],
                r.json()['data']['wendu'],
                r.json()['data']['shidu'],
                r.json()['data']['forecast'][0]['fl'],
                r.json()['data']['forecast'][0]['notice'],
            )
        else:
            weathermsg = '天气查询失败,请稍后再试!'
        
        self.ui.textedit.settext(weathermsg)
    
    def getcode(self, cityname):
        citydict = {"北京": "101010100",
                    "上海": "101020100",
                    "天津": "101030100"}
        
        return citydict.get(cityname, '101010100')
    
    def cleartext(self):
        self.ui.textedit.clear()


if __name__ == '__main__':
    myapp = qapplication(sys.argv)
    mydlg = maindialog()
    mydlg.show()
    sys.exit(myapp.exec_())

最终运行显示效果如下:

完整demo地址:https://github.com/lovesoo/test_demo/tree/master/pyqt5

4、参考资料

  1. https://www.riverbankcomputing.com/static/docs/pyqt5/

  2. 《pyqt5快速开发与实战 pdf》 网盘地址 提取码:k3xx

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网