python使用pyqt写带界面工具的示例代码


Posted in Python onOctober 23, 2017

上篇介绍的使用python自带tkinter包,来写带界面的工具。

此篇介绍使用pyqt来开发测试工具。

tkinter的好处是python官方自带,上手容易(但手写控件复杂),布局和摆放都不直观和容易,因为是像素坐标定位,需要花较长时间在界面开发上。pyqt是第三方gui开发工具,是目前公认的python上最好的客户端界面开发工具,因为控件是通过qt设计师的手动拖拽,调整颜色 字体 大小等样式也很简单,不需要去代码层面来写大量界面代码,真正的所见即所得。

学习pyqt需要安装这些文件,pyqt是python第三方包,eric是qt设计界面,sip在工具打包时候需要用到。

python使用pyqt写带界面工具的示例代码

安装好环境后,双击运行eric4.bat文件(我这里是eric4版本)

python使用pyqt写带界面工具的示例代码

运行eric4.bat文件后的界面,点击designer图标,进入qt设计视图

python使用pyqt写带界面工具的示例代码

此图为qt设计师界面

python使用pyqt写带界面工具的示例代码

通过拖拽左侧的控件列表中的元件到ui中就可以。布局完成界面达到满意的效果后,点击菜单栏的文件另存为,保存为ui文件,文件后缀默认是.ui。

使用cmd 命令将.ui文件转换为.py文件,命令是

pyuic4 -o syui.py suoyouxiangmu.ui

前面是py文件名称,后面是刚才保存的ui的文件名,执行此命令后会看到文件夹多了一个叫syui.py的文件。

打开文件,可以看到文件的大致内容,截图如下

python使用pyqt写带界面工具的示例代码

python使用pyqt写带界面工具的示例代码

要想把从ui转换得到的py文件,显示出界面来,还需要加入代码

python使用pyqt写带界面工具的示例代码

不过,强烈建议不要这么写,不要把工具的功能代码和ui转换得到的py代码写在一个文件,因为在开发工具时候可能经常用调整界面不断的把ui转换成py代码 ,如果代码写在这文件,那么之前写的功能代码将会被覆盖了,把红框子中这段代码和后代功能代码写在另外一个文件。

pyqt中将一个函数和按钮绑定的语法是 mainwindow.pushButton_2.clicked.connect(function)

下面介绍一些获取控件的值和给控件赋默认值的方法

mainwindow.lineEdit.setText((u"zg 额外abc")) #给输入框赋值

mainwindow.textEdit.setPlainText('') #给texedit赋值

mainwindow.comboBox.setCurrentIndex(2) #给下拉框赋值

mainwindow.checkBox.setChecked(1) #给复选框checkbox赋值,可以填写True或者False 或0 ,1

 
print unicode(QString(mainwindow.lineEdit.text()))  #获取输入框的值
unicode(QString(mainwindow.textEdit.toPlainText()))#获textedit的值
print unicode(QString(mainwindow.comboBox.currentText()))#获取下拉框的值

print mainwindow.comboBox.currentIndex()       #获取下拉框的index
if mainwindow.checkBox.isChecked()==True  获取复选框checkbox的值

功能代码该怎么写就怎么写,与普通纯脚本的代码没有区别。如果事先把后台脚本功能写好了,加入到界面来只需要花很少的时间。需要说明的是,一些执行时间比较长的函数例如循环requests,或者接口的本上响应时间很大,需要用到Qthread子线程,否则使用普通的函数会把客户端界面卡死一段时间直至函数运行结束。

下面来展示我使用pyqt做的几个工具。我这几个工具,都是左边界面右边控制台显示的形式,非常方便在一个界面就能看到运行结果,不需要在界面操作然后去python ide的控制台去看结果。

此工具是将字符串进行base64编码或解码的工具,因为我们公司的接口都是前端传json的base64编码字符串给后台,后台再进行base64编码的形式,在做测试时候,经常会发来base64加密的字符串,如果不解密完全看不懂请求的什么意思什么功能。如果你抓我们公司项目的登录接口的包,会完全不知所措,因为大多数web都是抓包出来可以看到 username:xxxxx password:xxxxx yanzhenma:xxxxx的形式,我们公司的需要base64解码后才能看得到键值对,因为如此原因所以做了一个工具;虽然网上大把的各种转码网站,但每次用时候去打开一个网页不方便,此工具是引用了python 自带的base64包,不然我自己写代码转换base64,也不知道base64到底是怎么个编码规则的。

python使用pyqt写带界面工具的示例代码

此工具是接口测试,进行get 和post请求,类似postman的功能和jmeter的接口测试功能。工具在后台代码中已处理cookie,只需要执行一次登录接口后,就可以操作其他的接口。第二个post的加了个base64的勾选,主要是为考虑工具通用性,不勾选base64适合大部分公司,当我们公司的如果不勾选,后台无法对一个不是base64加密的字符串进行base64解码,当然会返回错误状态码。工具是利用reqeusts做的,此工具利用了Qthread,否则遇上响应时间大的接口会卡死界面。

python使用pyqt写带界面工具的示例代码

此工具是用客户端来代替本应该是app端完成的功能。正常测试是需要把txt中的一个字符串用工具生成二维码图片,然后用app扫描二维码,如果子码和父码比例是20比1,需要扫每生成一个二维码然后app扫描一次,完成一个过程需要10分钟左右。工具是直接一次性赋值txt20行子吗字符串,然后复制一个父码字符串到输入框,点击确认关联,后台会自动分割20个子码的网址,并且取出网址中的码值,这个地方主要利用正则表达式分割出20个子码码值,然后按照接口参数的格式post到服务端,整个过程20秒就可以完成。是很快吧,这个app由于需要扫码的原因无法使用appium,用接口来代替app的功能,对于测试业务流程节约大量时间。

当然这种工具的方法还是只能一次次的进行关联,后来因为有了新的需求,我使用的方法是纯脚本,读取两个记事本,每个记事本20000行,一次性的读取两个记事本内容后多次进行指定行的相互自动关联,假如按20:1的比例关联,关联20000个码值,一个接口一般0.2秒就可以返回接口,使用单线程requests也就几分钟吧。

python使用pyqt写带界面工具的示例代码

此工具是测试项目的app功能的部分功能,把app多个界面的功能聚合到一个界面,辅助测试,比如测试报警的短信功能,用app填写各种表单需要2分钟,用工具只需要2秒钟,因为后台处理了大量默认参数。

python使用pyqt写带界面工具的示例代码

此工具是检测线上服务器服务运行状态的工具,可以不间断的检测各个接口的返回是否正常,数据库状态是否正常,web服务器是否有异常。只需要设置指定的时间就可以自动循环去检测,把每天的每条命令的请求写到一个log日志中。一旦有异常将捕获到的异常,发送给相关的邮件人,并且把每天的每条命令的请求写到一个log日志中,并发送短信给相关人员,避免出问题了还不知情。其中邮件用的是python的smtlib的邮件功能,短信是让php做了一个发短信的接口,我只需要按制定的格式post相关内容到php,就可以发短信通知大家了。

之前做这个工具是做成了windows service的形式,把服务安装到windows的服务中静默运行,但是没要这种客户端方式可控性强。

python使用pyqt写带界面工具的示例代码

此工具是给一个朋友做的功能,他需要不在cmd中运行cmd命令。用的是subprocess,代码比较短在此贴出代码了。

python使用pyqt写带界面工具的示例代码

import subprocess
ui.lineEdit_14.setText((u"ping 127.0.0.1"))
ui.lineEdit_15.setText((u"https://180.42.98.2/uniform/user-login.action"))

class CmdThread(QThread):
  _signal = pyqtSignal(str)
  def __int__(self):
    super(CmdThread,self).__init__()

  def run(self):
    cmd_str=unicode(QString(ui.lineEdit_14.text()))
    print u'\n发送的cmd命令是: ',cmd_str
    try:
      ot=subprocess.check_output(cmd_str, shell=True)

      print ot.decode('gbk').encode('utf8')
    except Exception,e:
      print e
    print '********************************************'

cmdThread=CmdThread()
cmdThread._signal.connect(chuli)           #####cmd某些命令会消耗大量时间,需要用到Qthread,chuli是一个函数,链接右边黑色控制台
def cmd():
  cmdThread.start()

此工具是百度发帖,具体的实现代码在另外的一个百度回帖博客中已经介绍了,由于此账号是从淘宝买的,并且在调试代码时候,已经被百度永久性封禁了回帖功能,所以返回的不是errcode0,220012是账号被禁用回帖功能的意思。

python使用pyqt写带界面工具的示例代码

最后介绍下pyqt工具的打包代码,使用py2exe打包成exe客户端。在cmd运行

#coding=utf-8
from distutils.core import setup
import py2exe
import glob

#python setup.py py2exe --includes sip   图标要手动复制图片到dist文件夹去

setup(
# targets to build
  windows = [{"script":"dysyui.py", "icon_resources": [(1, "logo1.ico")]} ],
  options = { "py2exe":{"dll_excludes":["MSVCP90.dll"],"bundle_files": 3,}},
  data_files = [("imageformats",glob.glob("C:\Python27\Lib\site-packages\PyQt4\plugins\imageformats\*.dll"))]
)

好了,关于pyqt就写这么多了。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python在windows下实现备份程序实例
Jul 04 Python
python获取一组数据里最大值max函数用法实例
May 26 Python
python开发之文件操作用法实例
Nov 13 Python
python中的lambda表达式用法详解
Jun 22 Python
python使用RNN实现文本分类
May 24 Python
Python比较配置文件的方法实例详解
Jun 06 Python
Python爬虫 scrapy框架爬取某招聘网存入mongodb解析
Jul 31 Python
python生成器推导式用法简单示例
Oct 08 Python
关于sys.stdout和print的区别详解
Dec 05 Python
python 已知平行四边形三个点,求第四个点的案例
Apr 12 Python
详解Tensorflow不同版本要求与CUDA及CUDNN版本对应关系
Aug 04 Python
Python可变与不可变数据和深拷贝与浅拷贝
Apr 06 Python
基于Django的python验证码(实例讲解)
Oct 23 #Python
itchat接口使用示例
Oct 23 #Python
python实现微信接口(itchat)详细介绍
Oct 23 #Python
python爬虫_微信公众号推送信息爬取的实例
Oct 23 #Python
Python 模拟员工信息数据库操作的实例
Oct 23 #Python
Scrapy爬虫实例讲解_校花网
Oct 23 #Python
Python学习笔记之if语句的使用示例
Oct 23 #Python
You might like
咖啡磨器 如何选购一台适合家用的意式磨豆机
2021/03/05 新手入门
php异常处理技术,顶级异常处理器
2012/06/13 PHP
利用PHP扩展Xhprof分析项目性能实践教程
2018/09/05 PHP
PHP simplexml_import_dom()函数讲解
2019/02/03 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
$.ajax返回的JSON无法执行success的解决方法
2011/09/09 Javascript
JS实现点击链接取消跳转效果的方法
2014/01/24 Javascript
js实现浏览器窗口大小被改变时触发事件的方法
2015/02/02 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
JS实现十字坐标跟随鼠标效果
2017/12/25 Javascript
JS设计模式之访问者模式定义与用法分析
2018/02/05 Javascript
Vue项目全局配置页面缓存之按需读取缓存的实现详解
2018/08/01 Javascript
微信小程序的部署方法步骤
2018/09/04 Javascript
JS获取当前时间的实例代码(昨天、今天、明天)
2018/11/13 Javascript
详解如何实现Element树形控件Tree在懒加载模式下的动态更新
2019/04/25 Javascript
thinkjs微信中控之微信鉴权登陆的实现代码
2019/08/08 Javascript
微信小程序pinker组件使用实现自动相减日期
2020/05/07 Javascript
JavaScript随机数的组合问题案例分析
2020/05/16 Javascript
如何手动实现一个 JavaScript 模块执行器
2020/10/16 Javascript
解决vant框架做H5时踩过的坑(下拉刷新、上拉加载等)
2020/11/11 Javascript
用webAPI实现图片放大镜效果
2020/11/23 Javascript
Python3一行代码实现图片文字识别的示例
2018/01/15 Python
Python *args和**kwargs用法实例解析
2020/03/02 Python
解决Python spyder显示不全df列和行的问题
2020/04/20 Python
python中的对数log函数表示及用法
2020/12/09 Python
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
PHP高级工程师面试问题推荐
2013/01/18 面试题
党校培训思想汇报
2013/12/30 职场文书
喷漆工的岗位职责
2014/03/17 职场文书
大学生英语演讲稿
2014/04/24 职场文书
服务理念标语
2014/06/18 职场文书
银行柜员与客户起冲突检讨书
2014/09/27 职场文书
忠诚与背叛观后感
2015/06/04 职场文书
MySQL系列之六 用户与授权
2021/07/02 MySQL
《地。-关于地球的运动-》单行本第七集上市,小说家朝井辽献上期待又害怕的推荐文
2022/03/31 日漫