python+tkinter 写的一个项目测试工具

目的是能够自动按照模板向禅道系统 提交bug,自动打包日志并上传到禅道上
以及结合进 项目中一些其他的功能,提升测试效率
主要是记录下 tkinter 的一些学习笔记

  1. tkinter 的基本布局 不同元素使用
  2. tkinter 的 容器 frame + 两种布局的 pack/grid的初步使用
  3. gif如何让它动起来,以及icon 如何添加的应用
    在这里作为一个记录,方便后期查询
# -*- coding: utf-8 -*-
# @Project :day08
# @Author  : YouZiFei
# @Time    : 2022/5/14 8:41
# @File    : demo_02.py
# @Software: PyCharm
import tkinter as tk
from tkinter import *
import tkinter.messagebox, tkinter.filedialog
from tkinter import ttk
from PIL import Image
from PIL import ImageSequence
import random  # 随机模块
import os, sys  # 系统模块STR_FRAME_FILENAME = "frame{}.png"  # 每帧图片的文件名格式class playGif():def __init__(self, file, temporary=""):  # temporary 指临时目录路径,为空时则随机生成self.__strPath = fileself.__index = 1  # 当前显示图片的帧数if len(temporary) == 0:self.strTemporaryFolder = self.crearteTemporaryFolder()  # 随机得到临时目录else:self.strTemporaryFolder = temporary  # 指定的临时目录self.__intCount = 0  # gif 文件的帧数self.decomposePics()  # 开始分解#def crearteTemporaryFolder(self):  # 生成临时目录名返回# 获取当前调用模块主程序的运行目录strSelfPath = str(os.path.dirname(os.path.realpath(sys.argv[0])))if len(strSelfPath) == 0:strSelfPath = os.path.join(os.getcwd())def createRandomFolder(strSelfPath):  # 内嵌方法,生成随机目录用length = random.randint(5, 10)  # 随机长度path = ""for i in range(length):path = path + chr(random.randint(97, 122))  # 随机生成a-z字母return os.path.join(strSelfPath, path)## 获取当前软件目录folder = createRandomFolder(strSelfPath)while os.path.isdir(folder):  # 已存在folder = createRandomFolder(strSelfPath)return folder#def decomposePics(self):  # 分解 gif 文件的每一帧到独立的图片文件,存在临时目录中i = 0img = Image.open(self.__strPath)self.__width, self.__height = img.size  # 得到图片的尺寸os.mkdir(self.strTemporaryFolder)  # 创建临时目录for frame in ImageSequence.Iterator(img):  # 遍历每帧图片frame.save(os.path.join(self.strTemporaryFolder, STR_FRAME_FILENAME.format(i + 1)))  # 保存独立图片i += 1self.__intCount = i  # 得到 gif 的帧数#def getPicture(self, frame=0):  # 返回第 frame 帧的图片(width=0,height=0)if frame == 0:frame = self.__indexelif frame >= self.__intCount:frame = self.__intCount  # 最后一张img = tk.PhotoImage(file=os.path.join(self.strTemporaryFolder, STR_FRAME_FILENAME.format(frame)))self.__index = self.getNextFrameIndex()return img  # 返回图片#def getNextFrameIndex(self, frame=0):  # 返回下一张的帧数序号if frame == 0:frame = self.__index  # 按当前插入帧数if frame == self.__intCount:return 1  # 返回第1张,即从新开始播放else:return frame + 1  # 下一张def playGif(self, tk, widget, time=100):  # 开始调用自身实现播放,time 单位为毫秒img = self.getPicture()widget.config(image=img)widget.image = imgtk.after(time, self.playGif, tk, widget, time)  # 在 time 时间后调用自身def close(self):  # 关闭动画文件,删除临时文件及目录files = os.listdir(self.strTemporaryFolder)for file in files:os.remove(os.path.join(self.strTemporaryFolder, file))os.rmdir(self.strTemporaryFolder)def donothing():print('IT WORKED')def submit_bug():submit_name = comb.get()bug_title = entry1.get()bug_text.insert('insert', '开始提交日志\n')bug_text.insert(tk.END, f'bug信息{bug_title},以及提交人{submit_name}\n')bug_text.insert(tk.END, '提交结束')def change_environ(index=1):if index == 1:tk.messagebox.showinfo('温馨提示', '正式环境切换成功')elif index == 2:tk.messagebox.showinfo('温馨提示', '测试环境切换成功')elif index == 3:tk.messagebox.showinfo('温馨提示', '开发服环境切换成功')def dothing(param):print(param)def select_file():filename = tk.filedialog.askopenfilename()if filename != '':print(filename)text_file.set(f'文件名称:{filename}')else:text_file.set('请先选择文件')def delete():  # 删除临时图root.destroy()gif.close()root = Tk()
# 第2步,给窗口的可视化起名字
root.title('XXXXX测试小工具')
root.iconbitmap("Awake.ico")# 第3步,设定窗口的大小(长 * 宽)
root.geometry('600x550')  # 这里的乘是小xframe1 = Frame(root)frame1.pack(side=TOP, fill=X)canvas = Label(frame1, bg='green')
image_file = tk.PhotoImage(file='test.gif')
# image = canvas.create_image(200, 0, anchor='n')
canvas.pack(side='top')
gif = playGif('test.gif')
# label.config(image=gif.getPicture())gif.playGif(root, canvas)  # 实现动态插放
root.protocol('WM_DELETE_WINDOW', delete)
# root.config(menu=m)# **** ToolBar *******toolbar = Frame(frame1)toolbar.pack(side=TOP, fill=X, ipady=20)
label_1 = Label(toolbar, text='环境切换: ', font=("Times", 15 , "bold"), fg='red')btn1 = Button(toolbar, text='正式服', command=lambda: change_environ(1))btn2 = Button(toolbar, text='测试服', command=lambda: change_environ(2))btn3 = Button(toolbar, text='开发服', command=lambda: change_environ(3))label_1.pack(side=LEFT, padx=2)
btn1.pack(side=LEFT, padx=2)
btn2.pack(side=LEFT, padx=2)
btn3.pack(side=LEFT,padx=2)# ***** LOGIN CREDENTIALS ******
frame2 = Frame(root)
frame2.pack(side=LEFT, fill=Y)label = Label(frame2, text='提Bug', font=("Times", 15, "bold"), fg='blue')label.grid(row=1, column=0, sticky=E)label1 = Label(frame2, text='Bug标题:')label1.grid(row=4, column=0, sticky=E)
label2 = Label(frame2, text='提交人:')
label2.grid(row=6, column=0, sticky=E)entry1 = Entry(frame2, width=30)
entry1.insert(0, '[BUG标题]:')
entry1.grid(row=4, column=1)
# 提交人var = StringVar()
comb = ttk.Combobox(frame2, textvariable=var, values=['sunwenxi','2','3','4',])
# 当下拉选项变化时执行对应的方法
comb.bind('<<ComboboxSelected>>', dothing)
comb.current(0)
comb.grid(row=6, column=1, sticky=W)btn = Button(frame2, text='提交bug', command=submit_bug)btn.grid(row=7, column=1, sticky=W)
label_log = Label(frame2, text='提交信息:')
label_log.grid(row=8, column=0, sticky=E)bug_text = Text(frame2, width=30, height=5)
bug_text.grid(row=8, column=1)# **** 构造数据 ******************
frame3 = Frame(root)
frame3.pack(side=LEFT, fill=Y)
status = Label(frame3, text='上传文件', font=("Times", 15, "bold"), fg='green')
status.grid(row=0, column=0)
label3 = Label(frame3, text='账号/手机号:')
label3.grid(row=2, column=0, sticky=E)
entry2 = Entry(frame3)
entry2.grid(row=2, column=1, sticky=W)
label4 = Label(frame3, text='密码:')
label4.grid(row=4, column=0, sticky=E)
entry3 = Entry(frame3)
entry3.grid(row=4, column=1, sticky=W)
label5 = Label(frame3, text='验证码:')
label5.grid(row=5, column=0, sticky=E)
entry4 = Entry(frame3)
entry4.grid(row=5, column=1, sticky=W)
# ---------------- 文件上传框------------
toolbar_0 = Frame(frame3)
toolbar_0.grid(row=0, column=1, sticky=W)
btn_file = Button(toolbar_0, text='选择文件', command=select_file)
btn_file.pack(side=LEFT, padx=2)
text_file = tk.StringVar()
text_file.set("请选择文件")
file_text = tk.Label(toolbar_0, textvariable=text_file)
# file_text = Label(toolbar_0, text="请选择文件")
file_text.pack(side=LEFT, padx=1)
# -----------------------------------------------
toolbar_1 = Frame(frame3)
toolbar_1.grid(row=7, column=1, sticky=W)
btn_test = Button(toolbar_1, text='测试服提交', command=select_file)
btn_ovr = Button(toolbar_1, text='正式服提交', command=donothing)
toolbar_2 = Frame(frame3)
toolbar_2.grid(row=8, column=1, sticky=W)
btn_ubind_test = Button(toolbar_2, text='测试服微信解绑', command=donothing)
btn_ubind_ovr = Button(toolbar_2, text='正式服微信解绑', command=donothing)
btn_test.pack(side=LEFT, padx=2)
btn_ovr.pack(side=LEFT, padx=2)
btn_ubind_test.pack(side=LEFT, padx=2)
btn_ubind_ovr.pack(side=LEFT, padx=2)
# 第10步,主窗口循环显示
root.mainloop()

实际效果图:

python+ tkinter做的一个项目辅助测试工具相关推荐

  1. 用Python做了一个法律查询小工具,非常好用

    用Python做了一个法律查询小工具,非常好用 效果展示 准备工作 主要代码 哈喽兄弟,今天给大家分享一个Python tkinter制作法律查询小工具. 光爬虫大家也只能自己用用,就算打包了exe, ...

  2. python换脸完整程序_小 200 行 Python 代码做了一个换脸程序

    原标题:小 200 行 Python 代码做了一个换脸程序 简介 在这篇文章中我将介绍如何写一个简短(200行)的 Python 脚本,来自动地将一幅图片的脸替换为另一幅图片的脸. 这个过程分四步: ...

  3. python监听多个udp端口_用Python写一个UDP端口测试工具(一)

    需求 最近有个运维需求,需要测试客户端的UDP端口与服务器的连通性. 需求也很简单:客户端测往服务端发UDP包,服务端收到包后响应客户端,当客户端能收到服务端的响应则可断定端口是可达的.但是客户端需要 ...

  4. 2个数组合并排序 php,PHP_基于php实现随机合并数组并排序(原排序),最近做了一个项目,其中有这 - phpStudy...

    基于php实现随机合并数组并排序(原排序) 最近做了一个项目,其中有这样一个需求要实现,原有帖子列表A,现在需要在A中推广新业务B,那么需要在A列表中1:1混合B中的数据,随机混合,但是需要保持A和B ...

  5. 图解 CSS (1): 先做一个样式表测试工具

    一直没有把样式表系统一下, 春节假期有空, 不能再等了. 为了方便学习, 先写了一个样式表测试工具: CssTest(点击下载) 工具非常简单, 写了 10 行左右的代码; 运行效果图: 代码文件: ...

  6. 软件测试复现工具,鼎恒资讯:做软件测试却不知道这些测试工具?利用好可以涨薪50%...

    原标题:鼎恒资讯:做软件测试却不知道这些测试工具?利用好可以涨薪50% 都说"工欲善其事,必先利其器".做软件测试行业,怎么能缺少好用的软件测试工具呢?对于很多小伙伴,尤其是新手来 ...

  7. 使用python tkinter做window窗体界面程序,以及python多线程处理解决tk界面卡死

    开发环境:pyCharm ,win10 开发语言:Python 使用python Tk做窗体应用程序,以及python多线程处理 主要实现功能爬取各大视频平台的视频的一个功能 首先先建一个Tkinte ...

  8. 技术总监灵魂一问:你精通那么多技术,为何还做不好一个项目?

    作者 | 李英权 来源 | 四猿外(ID:si-yuanwai) 编写高质量可维护的代码既是程序员的基本修养,也是能决定项目成败的关键因素,本文试图总结出问题项目普遍存在的共性问题并给出相应的解决方案 ...

  9. 说说这半年做的一个项目,并分享给各位

    已经快一年没有写博客了,实在是太忙了,忙到已经没有时间写文章.近半年的时间一直在忙着一个新项目,最近终于有了阶段性成果,觉得很有必要写写文章来记录一下这个新的项目.趁着这两天赶路的空闲时间记录分享一下 ...

最新文章

  1. Linux下vi和vim模式相互切换
  2. [读书笔记]《Head First Servlets JSP》2nd
  3. 【独家】衣服上的铁锈去除简易方法
  4. python os write_Python 3:写入方法与os.write返回的字节数
  5. python opencv 利用分水岭算法实现对物体的分割 图文详细注释版 以分割官网提供的硬币为例
  6. 51nod 1218 最长递增子序列 V2(dp + 思维)
  7. 谷歌插件无法显示在地址栏右侧
  8. 用AVPlayer播放视频
  9. 牛客假日团队赛31 A Mowing the Lawn (单调队列维护dp)
  10. 也许你需要看看这篇文章
  11. 新时达系统服务器怎么看故障,新时达系统故障详解:38故障
  12. 【SpringBoot新手篇】SpringBoot优雅文件上传方式
  13. 多核芯片间的核间通信IPC机制
  14. 布莱叶盲文-谷歌生态
  15. git提交,安装配置 commitizen cz-conventional-emoji $git cz代替$git commit
  16. Java 设计模式总结及六大设计原则
  17. NVIDIA 显卡驱动CUDA ToolkitcuDNN下载地址
  18. 180/360度舵机控制方法
  19. linux驱动开发之spi-omap-100k.c源码分析
  20. 网络上长说的监听某个端口是什么意思

热门文章

  1. _ReturnAddress 使用
  2. [Codevs] 一塔湖图
  3. c++练习 日期的顺延显示
  4. 关联规则----Apriori算法以及代码实现
  5. PIC单片机之中断程序
  6. 只拿死工资会杀死一个人的人生
  7. 【OpenGL】VAO数组实现一个OpenGL程序绘制多个图形:绘制五星红旗
  8. 海思IPC平台快速拔插SD卡会出现SD卡不识别解决方法
  9. ViewPager 添加广告页面小圆点指示器效果
  10. 工具变量:顶刊中的Shock-IV整理