因為壓測一個系統,需要大量的id。網上找的工具一次最多生成500個,完全是杯水車薪了。就找了python生成的代碼,修改成一次生成36萬個,這次夠用了。為了方便以後使用,就學習開發一個GUI界面,將之打包成exe小工具。這裡記錄一下整個學習流程。
選擇使用wxPython配套的開發工具wxFormBuilder,它的圖形可視化界面可以快速直觀的幫助我搭建起GUI界面。
1、wxPython可以從官方網站http://wxpython.org下載,或者使用pip下載wxPython依賴庫。
pip installer wxPython
2、安裝圖形可視化生成工具
wxFormBuilder 是一款開源的跨平台WYSIWYG GUI構建器,可將wxWidget GUI設計轉換為C ++,Python,PHP或XML格式。
github項目地址https://github.com/wxFormBuilder/wxFormBuilder,
這裡下載最新版https://github.com/wxFormBuilder/wxFormBuilder/releases,安裝到本地。默認安裝。
1、先選擇項目保存代碼為python,代碼文件名稱window。
2、選擇Frame控件、Layout方式等,這裡參考學習:https://blog.csdn.net/abc6368765/article/details/121796397
https://zhuanlan.zhihu.com/p/107451739?utm_source=wechat_session
建立以下界面,可以輸入年份,選擇地區,然後生成,下方可以選擇文件夾保存生成的txt文件。
點擊‘開始生成’按鈕後,程序開始運行,建立txt文件,進度條實時更新。
3、建立報錯與成功提示彈窗Dialog,在選擇錯誤地址與生成完成時,彈窗提示。
添加事件綁定,按鈕與進度條方法
4、F8保存代碼,或者復制python頁面的代碼使用。
1、將上面生成的window.py文件放到項目下面,主文件內導入GUI界面
import window。因為上面自動生成的window.py內容會隨著界面變化而變化,所以不要直接修改這個文件。
2、初始化窗口,完善進度條與生成按鈕的方法。
將生成id代碼,放在按鈕函數下面。(太長就不粘了)
#!/usr/bin/env python
# -*- coding:utf-8 -*-
import wx #wxPython
import window
class ff1(window.MyDialog1):
'''失敗提示彈窗'''
def __init__(self, parent):
window.MyDialog1.__init__(self, parent)
class ff2(window.MyDialog11):
'''成功提示彈窗'''
def __init__(self, parent):
window.MyDialog11.__init__(self, parent)
class MainWindow(window.sfz):
'''主窗口程序'''
def __init__(self, parent):
window.sfz.__init__(self,parent)
self.jindutiao=0 #進度條值
def m_gauge1OnChar(self, event):
'''進度條'''
self.m_gauge1.SetValue(self.jindutiao) #更新進度條
if self.jindutiao == 100 :
self.m_button1.Enable() #啟用按鈕
dialog=ff2(main_win) #成功彈窗
dialog.ShowModal()
def gennerator(self, event):
''' 生成按鈕:獲取年份、地區、保存地址等 '''
self.jindutiao=0 #按下按鈕,置為0。不報錯後續置灰按鈕
year= str(self.year1.GetValue()) #年份 GetValue()返回當前文本框中的所有文案
where=self.where1.GetStringSelection() #地區 GetStringSelection() 返回當前文本框中選中的文本
for key, value in bianma.AREA_INFO.items():
if value == where:
AREA2 = key #地區編碼
path=self.path.GetPath() #保存路徑判斷
if path == "不選地址,文件默認保存在桌面":
path = os.path.join(os.path.expanduser("~"), 'Desktop') #獲取桌面路徑
elif os.path.exists(path) == True: #判斷路徑是否存在
path = self.path.GetPath()
else:
dialog=ff1(main_win) #錯誤提示框
dialog.ShowModal()
self.jindutiao=-1
if self.jindutiao>=0:
event.GetEventObject().Disable() #禁用按鈕
3、啟動GUI界面
if __name__ == '__main__':
app = wx.App() #每一個wxPython應用程序都是一個wx.App實例
main_win = MainWindow(None) #None表示這個frame是頂層的框架,沒有父框架
main_win.Show(True) #show()方法激活窗體,True顯示這個Frame(窗口);False,隱藏窗口;
app.MainLoop() #運行程序
4、運行程序,點擊生成按鈕,程序在桌面成功建立了txt文件,本來以為可以完工了,但工具界面立馬提示未響應,程序假死。。。
1、出問題了,百度說計算時間太長,ui界面反應不了,程序就無響應。這當然要解決,思路是調用線程計算耗時的代碼,pubsub在線程與界面之間通訊。
參考:
https://www.bajins.com/Python/PythonGUI.html#多線程防假死動態刷新界面
https://blog.csdn.net/rockcandy123/article/details/121310660
2、主程序新增pub.subscribe(self.m_gauge1OnChar, “update”),訂閱
class MainWindow(window.sfz):
'''主窗口程序'''
def __init__(self, parent):
window.sfz.__init__(self,parent)
pub.subscribe(self.m_gauge1OnChar, "update")#發布一個叫update的主題,觸發m_gauge1OnChar函數
def m_gauge1OnChar(self, event):
'''進度條'''
self.jindutiao = event
self.m_gauge1.SetValue(self.jindutiao) #更新進度條
3、生成程序放線程裡面,用pub向GUI發消息。
經調試,假死問題解決。
class TestThread(threading.Thread):
'''多線程防假死與線程間傳遞消息'''
def __init__(self,year,where,path,AREA2):
self.year=year
self.where=where
self.path=path
self.AREA2=AREA2
threading.Thread.__init__(self) #線程實例化時立即啟動
self.start()
self.jindutiao=0
def run(self):
"""線程執行合成身份證代碼"""
'''計算耗時的代碼略'''
pub.sendMessage("update", event=self.jindutiao) #發update消息,指定event參數的值
1、首先安裝pyinstaller 包
pip install pyinstaller
在代碼文件夾內,打開cmd,使用命令打包成一個exe.
pyinstaller -F -w -i logo.ico sfz.py
生成exe文件在dist裡面。但是又發現一個問題,生成的文件偏大,這不能忍。百度去。
2、網上說主要原因是pyinstaller會把python環境中的很多項目沒有用到的包都一起打包進去,這樣就增大了exe的大小。
解決方法是使用虛擬環境,如:pipenv庫、anaconda創建的虛擬環境
參考:
https://blog.csdn.net/yueyi0221/article/details/121717471
https://zhuanlan.zhihu.com/p/348120084
3、兩個環境都試了,都可以用,打包的程序差不多大小。最後工具9M多點點。
制作小工具之路,一步一坑,但也學到了wxPython、pub等基礎使用,以後再有類似開發相信會更得心應手。
人生苦短,我學python。
工具與代碼放盤裡了,鏈接:https://pan.baidu.com/s/18sJiBU6cmVOeitVNgjyT1Q
提取碼:b2ie