PyQt完整入门教程
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、参考资料
《pyqt5快速开发与实战 pdf》 网盘地址 提取码:k3xx
上一篇: python初学者必看学习路线图!!!
下一篇: 学到了