python使用pyqt寫帶界面工具的示例代碼
上篇介紹的使用python自帶tkinter包,來(lái)寫帶界面的工具。
此篇介紹使用pyqt來(lái)開(kāi)發(fā)測(cè)試工具。
tkinter的好處是python官方自帶,上手容易(但手寫控件復(fù)雜),布局和擺放都不直觀和容易,因?yàn)槭窍袼刈鴺?biāo)定位,需要花較長(zhǎng)時(shí)間在界面開(kāi)發(fā)上。pyqt是第三方gui開(kāi)發(fā)工具,是目前公認(rèn)的python上最好的客戶端界面開(kāi)發(fā)工具,因?yàn)榭丶峭ㄟ^(guò)qt設(shè)計(jì)師的手動(dòng)拖拽,調(diào)整顏色 字體 大小等樣式也很簡(jiǎn)單,不需要去代碼層面來(lái)寫大量界面代碼,真正的所見(jiàn)即所得。
學(xué)習(xí)pyqt需要安裝這些文件,pyqt是python第三方包,eric是qt設(shè)計(jì)界面,sip在工具打包時(shí)候需要用到。
安裝好環(huán)境后,雙擊運(yùn)行eric4.bat文件(我這里是eric4版本)
運(yùn)行eric4.bat文件后的界面,點(diǎn)擊designer圖標(biāo),進(jìn)入qt設(shè)計(jì)視圖
此圖為qt設(shè)計(jì)師界面
通過(guò)拖拽左側(cè)的控件列表中的元件到ui中就可以。布局完成界面達(dá)到滿意的效果后,點(diǎn)擊菜單欄的文件另存為,保存為ui文件,文件后綴默認(rèn)是.ui。
使用cmd 命令將.ui文件轉(zhuǎn)換為.py文件,命令是
pyuic4 -o syui.py suoyouxiangmu.ui
前面是py文件名稱,后面是剛才保存的ui的文件名,執(zhí)行此命令后會(huì)看到文件夾多了一個(gè)叫syui.py的文件。
打開(kāi)文件,可以看到文件的大致內(nèi)容,截圖如下
要想把從ui轉(zhuǎn)換得到的py文件,顯示出界面來(lái),還需要加入代碼
不過(guò),強(qiáng)烈建議不要這么寫,不要把工具的功能代碼和ui轉(zhuǎn)換得到的py代碼寫在一個(gè)文件,因?yàn)樵陂_(kāi)發(fā)工具時(shí)候可能經(jīng)常用調(diào)整界面不斷的把ui轉(zhuǎn)換成py代碼 ,如果代碼寫在這文件,那么之前寫的功能代碼將會(huì)被覆蓋了,把紅框子中這段代碼和后代功能代碼寫在另外一個(gè)文件。
pyqt中將一個(gè)函數(shù)和按鈕綁定的語(yǔ)法是 mainwindow.pushButton_2.clicked.connect(function)
下面介紹一些獲取控件的值和給控件賦默認(rèn)值的方法
mainwindow.lineEdit.setText((u"zg 額外abc")) #給輸入框賦值 mainwindow.textEdit.setPlainText('') #給texedit賦值 mainwindow.comboBox.setCurrentIndex(2) #給下拉框賦值 mainwindow.checkBox.setChecked(1) #給復(fù)選框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 獲取復(fù)選框checkbox的值
功能代碼該怎么寫就怎么寫,與普通純腳本的代碼沒(méi)有區(qū)別。如果事先把后臺(tái)腳本功能寫好了,加入到界面來(lái)只需要花很少的時(shí)間。需要說(shuō)明的是,一些執(zhí)行時(shí)間比較長(zhǎng)的函數(shù)例如循環(huán)requests,或者接口的本上響應(yīng)時(shí)間很大,需要用到Qthread子線程,否則使用普通的函數(shù)會(huì)把客戶端界面卡死一段時(shí)間直至函數(shù)運(yùn)行結(jié)束。
下面來(lái)展示我使用pyqt做的幾個(gè)工具。我這幾個(gè)工具,都是左邊界面右邊控制臺(tái)顯示的形式,非常方便在一個(gè)界面就能看到運(yùn)行結(jié)果,不需要在界面操作然后去python ide的控制臺(tái)去看結(jié)果。
此工具是將字符串進(jìn)行base64編碼或解碼的工具,因?yàn)槲覀児镜慕涌诙际乔岸藗鱦son的base64編碼字符串給后臺(tái),后臺(tái)再進(jìn)行base64編碼的形式,在做測(cè)試時(shí)候,經(jīng)常會(huì)發(fā)來(lái)base64加密的字符串,如果不解密完全看不懂請(qǐng)求的什么意思什么功能。如果你抓我們公司項(xiàng)目的登錄接口的包,會(huì)完全不知所措,因?yàn)榇蠖鄶?shù)web都是抓包出來(lái)可以看到 username:xxxxx password:xxxxx yanzhenma:xxxxx的形式,我們公司的需要base64解碼后才能看得到鍵值對(duì),因?yàn)槿绱嗽蛩宰隽艘粋€(gè)工具;雖然網(wǎng)上大把的各種轉(zhuǎn)碼網(wǎng)站,但每次用時(shí)候去打開(kāi)一個(gè)網(wǎng)頁(yè)不方便,此工具是引用了python 自帶的base64包,不然我自己寫代碼轉(zhuǎn)換base64,也不知道base64到底是怎么個(gè)編碼規(guī)則的。
此工具是接口測(cè)試,進(jìn)行g(shù)et 和post請(qǐng)求,類似postman的功能和jmeter的接口測(cè)試功能。工具在后臺(tái)代碼中已處理cookie,只需要執(zhí)行一次登錄接口后,就可以操作其他的接口。第二個(gè)post的加了個(gè)base64的勾選,主要是為考慮工具通用性,不勾選base64適合大部分公司,當(dāng)我們公司的如果不勾選,后臺(tái)無(wú)法對(duì)一個(gè)不是base64加密的字符串進(jìn)行base64解碼,當(dāng)然會(huì)返回錯(cuò)誤狀態(tài)碼。工具是利用reqeusts做的,此工具利用了Qthread,否則遇上響應(yīng)時(shí)間大的接口會(huì)卡死界面。
此工具是用客戶端來(lái)代替本應(yīng)該是app端完成的功能。正常測(cè)試是需要把txt中的一個(gè)字符串用工具生成二維碼圖片,然后用app掃描二維碼,如果子碼和父碼比例是20比1,需要掃每生成一個(gè)二維碼然后app掃描一次,完成一個(gè)過(guò)程需要10分鐘左右。工具是直接一次性賦值txt20行子嗎字符串,然后復(fù)制一個(gè)父碼字符串到輸入框,點(diǎn)擊確認(rèn)關(guān)聯(lián),后臺(tái)會(huì)自動(dòng)分割20個(gè)子碼的網(wǎng)址,并且取出網(wǎng)址中的碼值,這個(gè)地方主要利用正則表達(dá)式分割出20個(gè)子碼碼值,然后按照接口參數(shù)的格式post到服務(wù)端,整個(gè)過(guò)程20秒就可以完成。是很快吧,這個(gè)app由于需要掃碼的原因無(wú)法使用appium,用接口來(lái)代替app的功能,對(duì)于測(cè)試業(yè)務(wù)流程節(jié)約大量時(shí)間。
當(dāng)然這種工具的方法還是只能一次次的進(jìn)行關(guān)聯(lián),后來(lái)因?yàn)橛辛诵碌男枨?,我使用的方法是純腳本,讀取兩個(gè)記事本,每個(gè)記事本20000行,一次性的讀取兩個(gè)記事本內(nèi)容后多次進(jìn)行指定行的相互自動(dòng)關(guān)聯(lián),假如按20:1的比例關(guān)聯(lián),關(guān)聯(lián)20000個(gè)碼值,一個(gè)接口一般0.2秒就可以返回接口,使用單線程requests也就幾分鐘吧。
此工具是測(cè)試項(xiàng)目的app功能的部分功能,把a(bǔ)pp多個(gè)界面的功能聚合到一個(gè)界面,輔助測(cè)試,比如測(cè)試報(bào)警的短信功能,用app填寫各種表單需要2分鐘,用工具只需要2秒鐘,因?yàn)楹笈_(tái)處理了大量默認(rèn)參數(shù)。
此工具是檢測(cè)線上服務(wù)器服務(wù)運(yùn)行狀態(tài)的工具,可以不間斷的檢測(cè)各個(gè)接口的返回是否正常,數(shù)據(jù)庫(kù)狀態(tài)是否正常,web服務(wù)器是否有異常。只需要設(shè)置指定的時(shí)間就可以自動(dòng)循環(huán)去檢測(cè),把每天的每條命令的請(qǐng)求寫到一個(gè)log日志中。一旦有異常將捕獲到的異常,發(fā)送給相關(guān)的郵件人,并且把每天的每條命令的請(qǐng)求寫到一個(gè)log日志中,并發(fā)送短信給相關(guān)人員,避免出問(wèn)題了還不知情。其中郵件用的是python的smtlib的郵件功能,短信是讓php做了一個(gè)發(fā)短信的接口,我只需要按制定的格式post相關(guān)內(nèi)容到php,就可以發(fā)短信通知大家了。
之前做這個(gè)工具是做成了windows service的形式,把服務(wù)安裝到windows的服務(wù)中靜默運(yùn)行,但是沒(méi)要這種客戶端方式可控性強(qiáng)。
此工具是給一個(gè)朋友做的功能,他需要不在cmd中運(yùn)行cmd命令。用的是subprocess,代碼比較短在此貼出代碼了。
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發(fā)送的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某些命令會(huì)消耗大量時(shí)間,需要用到Qthread,chuli是一個(gè)函數(shù),鏈接右邊黑色控制臺(tái) def cmd(): cmdThread.start()
此工具是百度發(fā)帖,具體的實(shí)現(xiàn)代碼在另外的一個(gè)百度回帖博客中已經(jīng)介紹了,由于此賬號(hào)是從淘寶買的,并且在調(diào)試代碼時(shí)候,已經(jīng)被百度永久性封禁了回帖功能,所以返回的不是errcode0,220012是賬號(hào)被禁用回帖功能的意思。
最后介紹下pyqt工具的打包代碼,使用py2exe打包成exe客戶端。在cmd運(yùn)行
#coding=utf-8 from distutils.core import setup import py2exe import glob #python setup.py py2exe --includes sip 圖標(biāo)要手動(dòng)復(fù)制圖片到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"))] )
好了,關(guān)于pyqt就寫這么多了。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- python+pyqt實(shí)現(xiàn)右下角彈出框
- python+pyqt實(shí)現(xiàn)12306圖片驗(yàn)證效果
- python3使用pyqt5制作一個(gè)超簡(jiǎn)單瀏覽器的實(shí)例
- PyQt5利用QPainter繪制各種圖形的實(shí)例
- Python3使用PyQt5制作簡(jiǎn)單的畫(huà)板/手寫板實(shí)例
- Python PyQt5標(biāo)準(zhǔn)對(duì)話框用法示例
- Python PyQt5實(shí)現(xiàn)的簡(jiǎn)易計(jì)算器功能示例
- PyQt5打開(kāi)文件對(duì)話框QFileDialog實(shí)例代碼
相關(guān)文章
Python利用字典將兩個(gè)通訊錄文本合并為一個(gè)文本實(shí)例
這篇文章主要介紹了Python利用字典將兩個(gè)通訊錄文本合并為一個(gè)文本實(shí)例,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01使用Python的內(nèi)建模塊collections的教程
這篇文章主要介紹了使用Python的內(nèi)建模塊collections的教程,示例代碼基于Python2.x版本,需要的朋友可以參考下2015-04-04Python實(shí)戰(zhàn)之整蠱神器合集加速友盡
讀萬(wàn)卷書(shū)不如行萬(wàn)里路,學(xué)的扎不扎實(shí)要通過(guò)實(shí)戰(zhàn)才能看出來(lái),本篇文章手把手帶用python來(lái)做幾個(gè)整蠱的小程序,大家可以在過(guò)程中查缺補(bǔ)漏,看看自己掌握程度怎么樣,發(fā)給朋友加固一下友誼2021-10-10轉(zhuǎn)換科學(xué)計(jì)數(shù)法的數(shù)值字符串為decimal類型的方法
今天小編就為大家分享一篇轉(zhuǎn)換科學(xué)計(jì)數(shù)法的數(shù)值字符串為decimal類型的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化
這篇文章主要介紹了pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)python的小伙伴們也有非常好的幫助,需要的朋友可以參考下2021-05-05