python+ tkinter做的一个项目辅助测试工具

  • Post author:
  • Post category:python




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 = 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 版权协议,转载请附上原文出处链接和本声明。