1、前言
測試組合生成器-allpairspy中,作者介紹了allpairspy工具,用于進(jìn)行測試參數(shù)的組合。
隨后發(fā)現(xiàn),如果每次要對新的參數(shù)進(jìn)行組合,都要打開腳本,編寫后再執(zhí)行,之后還要手動將參數(shù)值拷貝到Excel表里,還是有些麻煩,在這里應(yīng)該要如何進(jìn)行優(yōu)化,節(jié)約不必要的工作量?
本篇將此腳本進(jìn)行優(yōu)化,將集成到Python的GUI工具包(Tkinter),并且可以將結(jié)果數(shù)據(jù)導(dǎo)入到Excel和TXT文件里。
2、簡介
Tkinter(即tkinterface,簡稱“Tk”)本質(zhì)上是對Tcl/Tk軟件包的Python接口封裝,它是Python官方推薦的GUI工具包,屬于Python自帶的標(biāo)準(zhǔn)庫模塊,當(dāng)安裝好Python后,就可以直接使用它,而無須另行安裝。
作為一款PythonGUI工具,Tkinter擁有良好的跨平臺性,支持Windows、Linux、Mac平臺,它傳承了Python語法簡潔、代碼易讀的基本特點(diǎn)。
3、快速上手
使用TkinterGUI工具包,快速創(chuàng)建自定義界面。
代碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 公眾號:AllTests軟件測試 importtkinter astk window = tk.Tk() # 設(shè)置窗口title window.title('公眾號:AllTests軟件測試') # 設(shè)置窗口大小:寬x高 window.geometry('400x200') # 獲取電腦屏幕大小 print("電腦分辨率 %dx%d "% (window.winfo_screenwidth(), window.winfo_screenheight())) # 獲取窗口大小,必須先刷新一下屏幕 window.update() print("窗口分辨率 %dx%d "% (window.winfo_width(), window.winfo_height())) # 改變背景顏色 window.config(background="#B3B3B3") # 設(shè)置窗口處于頂層 window.attributes('-topmost', True) # 設(shè)置窗口透明度 window.attributes('-alpha', 1) # 設(shè)置窗口被允許最大調(diào)整范圍 window.maxsize(600, 600) # 設(shè)置窗口被允許最小調(diào)整范圍 window.minsize(50, 50) # 更改左上角窗口icon圖標(biāo) window.iconbitmap('C:/Users/wangmeng/Desktop/mytest/tupian.ico') # 添加文本內(nèi)容,并對字體添加相應(yīng)的格式 font(字體,字號,"字體類型") tk.Label(window, text="公眾號:AllTests軟件測試", bg="yellow", fg="red", font=('Times', 15, 'bold italic underline')).place(x=80, y=60) # 添加按鈕,以及按鈕的文本,并通過command參數(shù)設(shè)置關(guān)閉窗口的功能 tk.Button(window, text="關(guān)閉", command=window.quit).place(x=200, y=120) # 進(jìn)入主循環(huán),顯示主窗口 window.mainloop()運(yùn)行腳本,彈出GUI界面。
控制臺輸出獲取到的分辨率。
4、測試組合生成器腳本優(yōu)化
需求點(diǎn):一個輸入框(將參數(shù)組合輸入進(jìn)去)、一個輸出框(將參數(shù)組合分組后打印出來)、分隔符下拉選擇項(用于匹配輸入的參數(shù)分隔符)、操作按鈕(運(yùn)行、導(dǎo)出Excel、導(dǎo)出TXT、刪除、關(guān)閉)
代碼如下:
#!/usr/bin/env python # -*- coding: utf-8 -*- # 公眾號:AllTests軟件測試 fromtkinter importfiledialog fromtkinter importttk, scrolledtext fromtkinter importmessagebox fromtkinter import* fromallpairspy importAllPairs importdatetime importopenpyxl importos """ 測試參數(shù)組合生成器 """ # 獲取桌面路徑 defget_path(): returnos.path.join(os.path.expanduser('~'), "Desktop") # 退出操作 defbutton_quit(): window.quit() # 刪除操作 defbutton_delete(): scr1.delete('0.0', END) scr2.delete('0.0', END) # 運(yùn)行操作 defbutton_run(): scr2.delete('0.0', END) globall_key globaloutput_content globalexport_content l_key = [] l_value = [] output_content = [] export_content = [] # 判斷輸入數(shù)據(jù)是否為空 ifscr1.get('1.0', 'end-1c') != "": print("輸入數(shù)據(jù) "+ " "+ scr1.get('1.0', 'end-1c')) # 數(shù)據(jù)分割 scr_list = scr1.get('0.0', 'end-1c').split(" ") # 判斷是否有空值在列表中,如果有就直接通過remove刪除 while''inscr_list: scr_list.remove('') print('列表數(shù)據(jù) '+ str(scr_list)) # 共有幾組數(shù)據(jù) print(len(scr_list)) iflen(scr_list) != 1: fori inscr_list: try: l = i.split(srclanguage1.get()) # 因素 l_key.append(l[0].strip()) l2 = l[1].split(srclanguage2.get()) # 選擇值 l_value.append(l2) exceptException asex: error = str(ex) messagebox.showerror(title='操作錯誤', message='運(yùn)行失敗,請檢查輸入數(shù)據(jù)!'+ " "+ error) break print("數(shù)據(jù)參數(shù) "+ str(l_value)) print("PAIRWISE:") fori, pairs inenumerate(AllPairs(l_value)): # 輸出內(nèi)容 output_content = "{:2d}: {}".format(i + 1, pairs) # print(output_content) scr2.insert(END, output_content) scr2.insert(END, " ") # 導(dǎo)出內(nèi)容 print(pairs) export_content.append(pairs) print(export_content) else: messagebox.showwarning(title='操作提示', message='輸入數(shù)據(jù)至少為2組!') else: messagebox.showwarning(title='操作提示', message='請輸入正確的數(shù)據(jù),再運(yùn)行!') # 導(dǎo)出Excel defbutton_export_excel(): excel_columns = ['A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1', 'I1', 'J1', 'K1', 'L1', 'M1', 'N1', 'O1', 'P1', 'Q1', 'R1', 'S1', 'T1', 'U1', 'V1', 'W1', 'X1', 'Y1', 'Z1', 'AA1', 'AB1', 'AC1', 'AD1', 'AE1', 'AF1', 'AG1', 'AH1', 'AI1', 'AJ1', 'AK1', 'AL1', 'AM1', 'AN1', 'AO1', 'AP1', 'AQ1', 'AR1', 'AS1', 'AT1', 'AU1', 'AV1', 'AW1', 'AX1', 'AY1', 'AZ1'] # 判斷輸出數(shù)據(jù)是否為空 ifscr2.get('1.0', 'end-1c') != "": print("輸出數(shù)據(jù) "+ " "+ scr2.get('1.0', 'end-1c')) try: wb = openpyxl.Workbook() sheet = wb.active fori, j inzip(l_key, excel_columns): sheet[j] = i foritem_tree inexport_content: value = item_tree # print(value) values = [str(strvalue) forstrvalue invalue] # print(values) sheet.append(values) # 將文件直接保存到桌面 # wb.save(f'{get_path()}/case' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.xlsx') # wb.close() # messagebox.showinfo(title='導(dǎo)出成功', message='已將Excel文件導(dǎo)出到桌面!') # 對話框保存文件 filepath = filedialog.asksaveasfilename(initialfile='默認(rèn)文件名.xlsx', filetypes=[("Excel文件", ".xlsx")]) iffilepath != "": # print("filepath " + filepath) wb.save(filepath) wb.close() messagebox.showinfo(title='導(dǎo)出成功', message='已導(dǎo)出Excel文件!') else: pass # print("filepath " + filepath) exceptException asex: error = str(ex) messagebox.showerror(title='導(dǎo)出失敗', message='導(dǎo)出失??!'+ " "+ error) else: messagebox.showwarning(title='操作提示', message='請先運(yùn)行后,再進(jìn)行導(dǎo)出!') # 導(dǎo)出TXT defbutton_export_txt(): # 判斷輸出數(shù)據(jù)是否為空 ifscr2.get('1.0', 'end-1c') != "": print("輸出數(shù)據(jù) "+ " "+ scr2.get('1.0', 'end-1c')) try: # 將文件直接保存到桌面 # filepath = f'{get_path()}/case' + datetime.datetime.now().strftime('%Y%m%d%H%M%S') + '.txt' # info_txt = "到桌面" # 對話框保存文件 filepath = filedialog.asksaveasfilename(initialfile='默認(rèn)文件名.txt', filetypes=[("txt文件", ".txt")]) info_txt = "" # 文件路徑是否為空 iffilepath != "": # print("filepath " + filepath) # 寫入文件 withopen(filepath, 'w') asfile_object: file_object.write(",".join(l_key)) foritem_tree inexport_content: print(",".join(item_tree)) file_object.write(' '+ ",".join(item_tree)) file_object.close() messagebox.showinfo(title='導(dǎo)出成功', message='已導(dǎo)出TXT文件'+ info_txt + '!') else: pass # print("filepath " + filepath) exceptException asex: error = str(ex) messagebox.showerror(title='導(dǎo)出失敗', message='導(dǎo)出失敗!'+ " "+ error) else: messagebox.showwarning(title='操作提示', message='請先運(yùn)行后,再進(jìn)行導(dǎo)出!') window = Tk() # 設(shè)置窗口title window.title("測試參數(shù)組合生成器") # 設(shè)置窗口大小:寬x高 window.geometry("850x600") srclanguage1 = StringVar() srclanguage1.set('=') # 標(biāo)簽 Label(window, text="因素分隔", font=("隸書", 12, 'bold')).place(x=690, y=80) language1 = ('=', '#') # 復(fù)選框 ttk.Combobox(window, values=language1, width=3, textvariable=srclanguage1, state='readonly').place(x=770, y=80) srclanguage2 = StringVar() srclanguage2.set('/') # 標(biāo)簽 Label(window, text="內(nèi)分隔符", font=("隸書", 12, 'bold')).place(x=690, y=110) language2 = ('/', '+') # 復(fù)選框 ttk.Combobox(window, values=language2, width=3, textvariable=srclanguage2, state='readonly').place(x=770, y=110) # 標(biāo)簽 Label(window, text="---輸入數(shù)據(jù)---", font=("隸書", 14, 'bold italic')).place(x=270, y=1) # 滾動文本框 scr1 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隸書", 12)) scr1.place(x=15, y=25) # 標(biāo)簽 Label(window, text="---輸出結(jié)果---", font=("隸書", 14, 'bold italic')).place(x=265, y=270) # 滾動文本框 scr2 = scrolledtext.ScrolledText(window, width=80, height=15, font=("隸書", 12)) scr2.place(x=15, y=300) # 按鈕 button1 = Button(window, text="運(yùn)行", bg="green", font=("隸書", 15), command=button_run) button1.place(x=560, y=560, width=80, height=30) # 按鈕 button2 = Button(window, text="導(dǎo)出Excel", bg="yellow", font=("隸書", 15), command=button_export_excel) button2.place(x=370, y=560, width=100, height=30) # 按鈕 button3 = Button(window, text="導(dǎo)出TXT", bg="yellow", font=("隸書", 15), command=button_export_txt) button3.place(x=200, y=560, width=100, height=30) # 按鈕 button4 = Button(window, text="刪除", bg="red", font=("隸書", 15), command=button_delete) button4.place(x=40, y=560, width=80, height=30) # 按鈕 button5 = Button(window, text="關(guān)閉", font=("隸書", 15), command=button_quit) button5.place(x=710, y=560, width=80, height=30) # 標(biāo)簽 Label(window, text="輸入數(shù)據(jù)示例", font=("隸書", 12, 'bold')).place(x=690, y=350) Label(window, text="因素=A/B/C", font=("隸書", 11)).place(x=690, y=380) Label(window, text="因素=1/2/3", font=("隸書", 11)).place(x=690, y=410) Label(window, text="因素=D/E/F", font=("隸書", 11)).place(x=690, y=440) Label(window, text="公眾號:AllTests軟件測試", font=("微軟雅黑", 10, 'bold'), fg='#EC3832').place(x=680, y=10) # 顯示窗口 window.mainloop()運(yùn)行腳本,彈出GUI界面。
接下來開始簡單測試一下,先準(zhǔn)備一下測試數(shù)據(jù):
品牌=X品牌/Y品牌 系統(tǒng)=Windows10/macOS 時間=按天/按周/按月/按年
將測試數(shù)據(jù)輸入到輸入框中,之后點(diǎn)擊運(yùn)行,輸出框顯示運(yùn)行后的結(jié)果,總共生成了8條用例。
點(diǎn)擊刪除按鈕,會將輸入和輸出框內(nèi)的數(shù)據(jù)都刪除掉。
點(diǎn)擊關(guān)閉按鈕,會關(guān)閉掉GUI界面。
代碼里可以設(shè)置將文件直接保存到桌面或者彈出對話框自定義保存,這里使用了對話框保存的方式。
點(diǎn)擊導(dǎo)出Excel,文件保存后,會提示導(dǎo)出成功。
打開Excel,顯示的結(jié)果數(shù)據(jù)。
代碼里可以設(shè)置將文件直接保存到桌面或者彈出對話框自定義保存,這里使用了對話框保存的方式。
導(dǎo)出TXT,文件保存后,會提示導(dǎo)出成功。
打開TXT,顯示的結(jié)果數(shù)據(jù)。
除了成功的提示信息外,也添加了一些提示與錯誤的信息。
當(dāng)沒有輸入數(shù)據(jù),直接點(diǎn)擊運(yùn)行按鈕時,會提示:
當(dāng)沒有運(yùn)行,而直接點(diǎn)擊導(dǎo)出Excel或?qū)С鯰XT時,會提示:
當(dāng)輸入的參數(shù)數(shù)據(jù)只有一組時,會提示:
當(dāng)輸入的數(shù)據(jù)格式不對,點(diǎn)擊運(yùn)行時,會提示:
如上,大概的功能點(diǎn)已經(jīng)測試完成,可以滿足所要的需求,但是還有一點(diǎn)需要改進(jìn),那就是每次打開都要執(zhí)行腳本,需要改為直接雙擊可運(yùn)行的文件。
步驟如下:
1、安裝pyinstaller
2、將腳本與圖片放到同一個文件夾目錄
3、執(zhí)行轉(zhuǎn)換腳本
pyinstaller -F -i tupian.ico combination_generator.py -w
4、執(zhí)行完成后,dist目錄里是.exe可執(zhí)行文件
審核編輯:劉清
-
生成器
+關(guān)注
關(guān)注
7文章
317瀏覽量
21050 -
GUI
+關(guān)注
關(guān)注
3文章
662瀏覽量
39753 -
python
+關(guān)注
關(guān)注
56文章
4798瀏覽量
84798
原文標(biāo)題:將Python腳本集成到GUI工具包-Tkinter
文章出處:【微信號:ExASIC,微信公眾號:ExASIC】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論