python+tkinter 写的一个项目测试工具
目的是能够自动按照模板向禅道系统 提交bug,自动打包日志并上传到禅道上
以及结合进 项目中一些其他的功能,提升测试效率
主要是记录下 tkinter 的一些学习笔记
- tkinter 的基本布局 不同元素使用
- tkinter 的 容器 frame + 两种布局的 pack/grid的初步使用
-
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 = file
self.__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 = 0
img = 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 += 1
self.__intCount = i # 得到 gif 的帧数
#
def getPicture(self, frame=0): # 返回第 frame 帧的图片(width=0,height=0)
if frame == 0:
frame = self.__index
elif 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 = img
tk.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') # 这里的乘是小x
frame1 = 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()
实际效果图:
版权声明:本文为Yxf11824原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。