0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

将Python脚本集成到GUI工具包

roborobo_0706 来源:AllTests软件测试 2023-02-15 16:40 次阅读

1、前言

测试组合生成器-allpairspy中,作者介绍了allpairspy工具,用于进行测试参数的组合。

随后发现,如果每次要对新的参数进行组合,都要打开脚本,编写后再执行,之后还要手动将参数值拷贝到Excel表里,还是有些麻烦,在这里应该要如何进行优化,节约不必要的工作量?

本篇将此脚本进行优化,将集成到Python的GUI工具包(Tkinter),并且可以将结果数据导入到Excel和TXT文件里。

2、简介

Tkinter(即tkinterface,简称“Tk”)本质上是对Tcl/Tk软件包的Python接口封装,它是Python官方推荐的GUI工具包,属于Python自带的标准库模块,当安装好Python后,就可以直接使用它,而无须另行安装。

作为一款PythonGUI工具,Tkinter拥有良好的跨平台性,支持Windows、Linux、Mac平台,它传承了Python语法简洁、代码易读的基本特点。

3、快速上手

使用TkinterGUI工具包,快速创建自定义界面。

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试

importtkinter astk

window = tk.Tk()
# 设置窗口title
window.title('公众号:AllTests软件测试')
# 设置窗口大小:宽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")
# 设置窗口处于顶层
window.attributes('-topmost', True)
# 设置窗口透明度
window.attributes('-alpha', 1)
# 设置窗口被允许最大调整范围
window.maxsize(600, 600)
# 设置窗口被允许最小调整范围
window.minsize(50, 50)
# 更改左上角窗口icon图标
window.iconbitmap('C:/Users/wangmeng/Desktop/mytest/tupian.ico')
# 添加文本内容,并对字体添加相应的格式 font(字体,字号,"字体类型")
tk.Label(window, text="公众号:AllTests软件测试", bg="yellow", fg="red", font=('Times', 15, 'bold italic underline')).place(x=80, y=60)
# 添加按钮,以及按钮的文本,并通过command参数设置关闭窗口的功能
tk.Button(window, text="关闭", command=window.quit).place(x=200, y=120)
# 进入主循环,显示主窗口
window.mainloop()
运行脚本,弹出GUI界面。

e87da548-ad0a-11ed-bfe3-dac502259ad0.png

控制台输出获取到的分辨率。

e8971e38-ad0a-11ed-bfe3-dac502259ad0.png

4、测试组合生成器脚本优化

需求点:一个输入框(将参数组合输入进去)、一个输出框(将参数组合分组后打印出来)、分隔符下拉选择项(用于匹配输入的参数分隔符)、操作按钮(运行、导出Excel、导出TXT、删除、关闭)

代码如下:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 公众号:AllTests软件测试

fromtkinter importfiledialog
fromtkinter importttk, scrolledtext
fromtkinter importmessagebox
fromtkinter import*
fromallpairspy importAllPairs
importdatetime
importopenpyxl
importos

"""
测试参数组合生成器
"""

# 获取桌面路径
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)

# 运行操作
defbutton_run():
scr2.delete('0.0', END)

globall_key
globaloutput_content
globalexport_content

l_key = []
l_value = []
output_content = []
export_content = []

# 判断输入数据是否为空
ifscr1.get('1.0', 'end-1c') != "":
print("输入数据 "+ "
"+ scr1.get('1.0', 'end-1c'))
# 数据分割
scr_list = scr1.get('0.0', 'end-1c').split("
")
# 判断是否有空值在列表中,如果有就直接通过remove删除
while''inscr_list:
scr_list.remove('')
print('列表数据 '+ str(scr_list))
# 共有几组数据
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='运行失败,请检查输入数据!'+ "
"+ error)
break

print("数据参数 "+ str(l_value))
print("PAIRWISE:")
fori, pairs inenumerate(AllPairs(l_value)):
# 输出内容
output_content = "{:2d}: {}".format(i + 1, pairs)
# print(output_content)
scr2.insert(END, output_content)
scr2.insert(END, "
")
# 导出内容
print(pairs)
export_content.append(pairs)
print(export_content)
else:
messagebox.showwarning(title='操作提示', message='输入数据至少为2组!')
else:
messagebox.showwarning(title='操作提示', message='请输入正确的数据,再运行!')

# 导出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']

# 判断输出数据是否为空
ifscr2.get('1.0', 'end-1c') != "":
print("输出数据 "+ "
"+ 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='导出成功', message='已将Excel文件导出到桌面!')

# 对话框保存文件
filepath = filedialog.asksaveasfilename(initialfile='默认文件名.xlsx', filetypes=[("Excel文件", ".xlsx")])
iffilepath != "":
# print("filepath " + filepath)
wb.save(filepath)
wb.close()
messagebox.showinfo(title='导出成功', message='已导出Excel文件!')
else:
pass
# print("filepath " + filepath)

exceptException asex:
error = str(ex)
messagebox.showerror(title='导出失败', message='导出失败!'+ "
"+ error)

else:
messagebox.showwarning(title='操作提示', message='请先运行后,再进行导出!')

# 导出TXT
defbutton_export_txt():
# 判断输出数据是否为空
ifscr2.get('1.0', 'end-1c') != "":
print("输出数据 "+ "
"+ 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='默认文件名.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='导出成功', message='已导出TXT文件'+ info_txt + '!')
else:
pass
# print("filepath " + filepath)

exceptException asex:
error = str(ex)
messagebox.showerror(title='导出失败', message='导出失败!'+ "
"+ error)

else:
messagebox.showwarning(title='操作提示', message='请先运行后,再进行导出!')


window = Tk()
# 设置窗口title
window.title("测试参数组合生成器")
# 设置窗口大小:宽x高
window.geometry("850x600")

srclanguage1 = StringVar()
srclanguage1.set('=')
# 标签
Label(window, text="因素分隔", font=("隶书", 12, 'bold')).place(x=690, y=80)
language1 = ('=', '#')
# 复选框
ttk.Combobox(window, values=language1, width=3, textvariable=srclanguage1, state='readonly').place(x=770, y=80)

srclanguage2 = StringVar()
srclanguage2.set('/')
# 标签
Label(window, text="内分隔符", font=("隶书", 12, 'bold')).place(x=690, y=110)
language2 = ('/', '+')
# 复选框
ttk.Combobox(window, values=language2, width=3, textvariable=srclanguage2, state='readonly').place(x=770, y=110)

# 标签
Label(window, text="---输入数据---", 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)

# 标签
Label(window, text="---输出结果---", 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="运行", bg="green", font=("隶书", 15), command=button_run)
button1.place(x=560, y=560, width=80, height=30)

# 按钮
button2 = Button(window, text="导出Excel", bg="yellow", font=("隶书", 15), command=button_export_excel)
button2.place(x=370, y=560, width=100, height=30)

# 按钮
button3 = Button(window, text="导出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="关闭", font=("隶书", 15), command=button_quit)
button5.place(x=710, y=560, width=80, height=30)

# 标签
Label(window, text="输入数据示例", 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()
运行脚本,弹出GUI界面。

e8a9be62-ad0a-11ed-bfe3-dac502259ad0.png

接下来开始简单测试一下,先准备一下测试数据:

品牌=X品牌/Y品牌
系统=Windows10/macOS
时间=按天/按周/按月/按年

将测试数据输入到输入框中,之后点击运行,输出框显示运行后的结果,总共生成了8条用例。

点击删除按钮,会将输入和输出框内的数据都删除掉。

点击关闭按钮,会关闭掉GUI界面。

e8c04dee-ad0a-11ed-bfe3-dac502259ad0.png

代码里可以设置将文件直接保存到桌面或者弹出对话框自定义保存,这里使用了对话框保存的方式。

点击导出Excel,文件保存后,会提示导出成功。

e8de0280-ad0a-11ed-bfe3-dac502259ad0.png

打开Excel,显示的结果数据。

e8f33d62-ad0a-11ed-bfe3-dac502259ad0.png

代码里可以设置将文件直接保存到桌面或者弹出对话框自定义保存,这里使用了对话框保存的方式。

导出TXT,文件保存后,会提示导出成功。

e90c0b94-ad0a-11ed-bfe3-dac502259ad0.png

打开TXT,显示的结果数据。

e91d95e4-ad0a-11ed-bfe3-dac502259ad0.png

除了成功的提示信息外,也添加了一些提示与错误的信息。

当没有输入数据,直接点击运行按钮时,会提示:

e930ef0e-ad0a-11ed-bfe3-dac502259ad0.png

当没有运行,而直接点击导出Excel或导出TXT时,会提示:

e941c52c-ad0a-11ed-bfe3-dac502259ad0.png

当输入的参数数据只有一组时,会提示:

e974993e-ad0a-11ed-bfe3-dac502259ad0.png

当输入的数据格式不对,点击运行时,会提示:

e9875e70-ad0a-11ed-bfe3-dac502259ad0.png

如上,大概的功能点已经测试完成,可以满足所要的需求,但是还有一点需要改进,那就是每次打开都要执行脚本,需要改为直接双击可运行的文件。

步骤如下:

1、安装pyinstaller

2、将脚本与图片放到同一个文件夹目录

e99813a0-ad0a-11ed-bfe3-dac502259ad0.png

3、执行转换脚本

pyinstaller -F -i tupian.ico combination_generator.py -w

4、执行完成后,dist目录里是.exe可执行文件






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 生成器
    +关注

    关注

    7

    文章

    315

    浏览量

    21009
  • GUI
    GUI
    +关注

    关注

    3

    文章

    660

    浏览量

    39668
  • python
    +关注

    关注

    56

    文章

    4796

    浏览量

    84664

原文标题:将Python脚本集成到GUI工具包-Tkinter

文章出处:【微信号:ExASIC,微信公众号:ExASIC】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    LabVIEW 2011模块和工具包(图像和信号处理)

    `数百种特定应用程序的图像和信号处理函数集成NI LabVIEW应用程序中。 可将NI LabVIEW扩展至特定的应用,如:声音和振动测量、机器视觉、RF通信、瞬时与短时信号分析等。 包括NI LabVIEW高级信号处理
    发表于 08-02 15:27

    Python人工智能学习工具包+入门与实践资料集锦

    ,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python。这些年来,接触和使用了很多Python工具包,特别是在文本处理,科
    发表于 11-22 14:46

    如何访问已与eIQ工具包一起安装的python版本?

    1.7.3 Ubuntu 安装程序并将该工具包安装在远程板上。 但是,我想知道如何访问该工具包的命令行工具,以及如何访问已与eIQ 工具包一起安装的
    发表于 06-07 06:46

    并口开发调试工具包 (推荐)

    并口开发调试工具包 (推荐):
    发表于 05-27 10:15 35次下载
    并口开发调试<b class='flag-5'>工具包</b> (推荐)

    固件工具包

    固件工具包 修改工具包 高兴向大家公布这个信息! 首先介绍一下这个工具地用途: 1、修改固件 - 通过此工具能够修改固件中绝大多数地信息及配置。 2、...
    发表于 03-16 14:49 71次下载

    Labview2013各工具包的功能简介

    Labview2013各工具包的功能简介Labview2013各工具包的功能简介
    发表于 11-20 11:20 0次下载

    WEBENCH 设计工具包综合概述

    WEBENCH 设计工具包综合概述
    发表于 09-15 09:28 6次下载
    WEBENCH 设计<b class='flag-5'>工具包</b>综合概述

    Python基础-图像处理工具包

    PythonWare公司提供了免费的图像处理工具包PIL(Python Image Library),该软件提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像
    发表于 03-30 14:09 17次下载

    Microchip苹果配件开发工具包

    这一讲是Microchip苹果配件开发工具包苹果配件开发工具包
    的头像 发表于 06-06 13:45 2297次阅读

    Microchip宣布推出全新的GUI开发工具包

    优化后的代码占用更少的内存,节省物料清单成本。相对于其他依赖高性能内核和3D图形加速的图形解决方案,新工具包的高效性能帮助开发人员为Microchip的节能微处理器创建丰富的GUI
    的头像 发表于 10-22 16:27 2507次阅读

    Cypherbridge uMODBUS工具包

      uMODBUS 工具包专为与各种 SCADA、工业和楼宇控制系统集成而设计。它与标准系统级解决方案兼容,包括:
    的头像 发表于 06-30 09:23 1077次阅读

    如何把Python脚本集成GUI工具包-Tkinter

    Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件Python 接口封装,它是 Python 官方推荐的 GUI
    的头像 发表于 05-05 15:02 654次阅读
    如何把<b class='flag-5'>Python</b><b class='flag-5'>脚本集成</b><b class='flag-5'>到</b><b class='flag-5'>GUI</b><b class='flag-5'>工具包</b>-Tkinter

    OneCommand x64的企业应用程序工具包(GUI)

    电子发烧友网站提供《OneCommand x64的企业应用程序工具包(GUI).exe》资料免费下载
    发表于 08-04 09:19 0次下载
    OneCommand x64的企业应用程序<b class='flag-5'>工具包</b>(<b class='flag-5'>GUI</b>)

    OneInstall工具包

    电子发烧友网站提供《OneInstall工具包.exe》资料免费下载
    发表于 08-18 14:54 0次下载
    OneInstall<b class='flag-5'>工具包</b>

    NPOI WEG报表工具包简介

    研究使用,发现工具包封装了部分功能但不完全,使用时还会报一堆不必要的错误,所以在这里工具包利用LVOOP进行封装。
    的头像 发表于 11-06 10:05 1042次阅读
    NPOI WEG报表<b class='flag-5'>工具包</b>简介