【小工具】文件大小扩充器

为什么做?
  • 上传测试经常需要各种类型、不同大小的文件,但收集起来相当麻烦,且大小不能满足刚好到边界值;
  • 测试时间经常很紧,测试数据可提前准备,便于测试;
  • 上传文件最好是校验16进制的文件头,而不是直接校验后缀。
  • 需求:能生成指定大小(精确到B)、类型(支持任意类型)且可正常打开的文件。
    • ❌直接改后缀;
    • ❌空文件生成器;(无法通过16进制头部信息校验)
怎么做?
  1. 思路:提前收集各类型中较小的文件,比如200K,在文件后扩充空字节,使其达到指定大小。
  2. 初版v1.0
import os
from tkinter import filedialog, simpledialog, messagebox, ttk
from tkinter import *
import tkinter as tk


# 定义一个函数来增加文件的大小
def increase_file_size(file_path, target_size):
    padding = b'\0' * (target_size - os.path.getsize(file_path))  # 计算需要添加的填充量
    with open(file_path, 'ab') as f:  # 以追加二进制模式打开文件
        f.write(padding)  # 写入填充


# 定义一个函数来浏览文件
def browse_files():
    if filetype_var.get() == "其他":
        custom_filetype = simpledialog.askstring("输入文件类型", "请输入文件类型(不含'.'):")
        filename = filedialog.askopenfilename(initialdir="/", title="选择文件",
                                              filetypes=[(custom_filetype, "*." + custom_filetype)])  # 打开一个文件对话框来选择文件
    else:
        filename = filedialog.askopenfilename(initialdir="/", title="选择文件",
                                              filetypes=[
                                                  (filetype_var.get(), "*." + filetype_var.get())])  # 打开一个文件对话框来选择文件
    if filename:  # 如果文件名存在
        file_path.set(filename)  # 更新文件路径
        selected_file_label.config(text=filename)  # 更新标签显示的文件名


# 定义一个函数来移除所选文件
def remove_file():
    file_path.set("")  # 清空文件路径
    selected_file_label.config(text="")  # 清空标签显示的文件名


# 定义一个函数来开始生成
def start_generate():
    if file_path.get() and target_size_var.get():  # 如果文件路径和目标大小都存在
        increase_file_size(file_path.get(), int(target_size_var.get()))  # 增加文件大小
        messagebox.showinfo("恭喜", "我很棒吧!扩充成功啦~")  # 显示成功消息


class Converter:
    def __init__(self, master):
        self.master = master
        # self.master.title('Byte Converter')
        # 定义转换字典
        self.units = {'B': 1, 'KB': 1024, 'MB': 1048576, 'GB': 1073741824, 'TB': 1099511627776}
        # 创建输入框
        self.input_value = tk.StringVar()
        self.entry = tk.Entry(master, textvariable=self.input_value)
        self.entry.grid(row=0, column=0, padx=(10, 0), pady=10)
        # 创建单位下拉菜单
        self.unit_value = tk.StringVar()
        self.unit_combo = ttk.Combobox(master, textvariable=self.unit_value)
        self.unit_combo['values'] = list(self.units.keys())
        self.unit_combo.grid(row=0, column=1, padx=(2, 0))
        # 创建目标单位下拉菜单
        self.target_unit_value = tk.StringVar()
        self.target_unit_combo = ttk.Combobox(master, textvariable=self.target_unit_value)
        self.target_unit_combo['values'] = list(self.units.keys())
        self.target_unit_combo.grid(row=0, column=2, padx=(2, 0))
        # 创建结果标签,font属性调整字体大小
        self.result_label = tk.Label(master, text='', font=('Times', 20, 'bold'))
        self.result_label.grid(row=1, column=0, columnspan=4, ipady=30)
        # 创建计算按钮
        self.calc_button = tk.Button(master, text='计算', command=self.calculate)
        self.calc_button.grid(row=2, column=0, rowspan=2, padx=10, ipadx=50, ipady=10)
        # 创建复制按钮
        self.copy_button = tk.Button(master, text='复制', command=self.copy_to_clipboard)
        self.copy_button.grid(row=2, column=2, rowspan=2, padx=10, ipadx=50, ipady=10)

        def calculate(self):
        try:
        value = float(self.input_value.get())
        unit = self.unit_value.get()
        target_unit = self.target_unit_value.get()
        bytes = value * self.units[unit]
        result = int(bytes / self.units[target_unit])
        self.result_label.config(text=str(result))
except ValueError:
        messagebox.showerror("出错啦", "大笨蛋,输入你要换算的数值呀!")
except KeyError:
        messagebox.showerror("出错啦", "大笨蛋,选择你要换算的单位呀!")

        def copy_to_clipboard(self):
        self.master.clipboard_clear()
        self.master.clipboard_append(self.result_label.cget("text"))
        messagebox.showinfo("恭喜", "我很棒吧!已经复制到剪切板啦~")  # 显示成功消息


        # 创建一个Tk窗口
        root = Tk()
        # 定义窗口的默认大小
        root.geometry("494x230+800+300")  # 设置窗口默认大小,后面俩参数是默认位置坐标
        # 修改为自定义的窗口图标
        root.iconbitmap('aaa.ico')
        # 工具名为“文件大小扩充器”
        root.title('飞飞版文件扩充器V1.0')

        tab_control = ttk.Notebook(root)
        tab1 = ttk.Frame(tab_control)
        tab_control.add(tab1, text='扩充功能')
        tab2 = ttk.Frame(tab_control)
        tab_control.add(tab2, text='换算功能')
        tab_control.pack(expand=1, fill='both')

        # 创建一个变量来存储目标大小
        target_size_var = StringVar()
        # 创建一个标签,显示字段名"目标大小",使用grid进行表格化管理,row行,column列
        Label(tab1, text="目标大小:").grid(row=0, column=0, padx=(20, 0), pady=10)
        # 创建一个输入框,输入目标大小
        Entry(tab1, textvariable=target_size_var).grid(row=0, column=1, columnspan=2)
        # 创建一个标签,显示单位"B",即字节
        Label(tab1, text="B").grid(row=0, column=3)

        # 创建一个变量来存储文件类型
        filetype_var = StringVar()
        filetype_var.set("pdf")  # 下拉框默认值pdf
        # 创建一个标签,显示字段名"文件类型"
        Label(tab1, text="文件类型:").grid(row=1, column=0, padx=(20, 0), pady=10)
        # 创建一个下拉框,选择文件类型
        OptionMenu(tab1, filetype_var, "pdf", "mp4", "png", "jpg", "zip", "其他").grid(row=1, column=1)

        # 创建一个变量来存储文件路径
        file_path = StringVar()
        # 创建一个标签,显示字段名"选择文件"
        Label(tab1, text="选择文件:").grid(row=2, column=0, padx=(20, 0), pady=10)
        # 创建一个【点击选择】按钮,点击时会调用browse_files函数
        Button(tab1, text="点击选择", command=browse_files).grid(row=2, column=1)
        # 创建一个【取消选择】按钮,点击时会调用remove_file函数
        Button(tab1, text="取消选择", command=remove_file).grid(row=2, column=2)

        # 创建一个标签来显示所选文件名,wraplength设置450px后自动换行
        selected_file_label = Label(tab1, text="", wraplength=450)
        selected_file_label.grid(row=3, column=0, columnspan=12, padx=(10, 0))

        # 创建一个按钮,点击时会调用start_generate函数
        Button(tab1, text="开始生成", font=("Times", 20), command=start_generate).grid(row=0, column=8, rowspan=3, columnspan=3,
        padx=(30, 0),
        pady=10, ipadx=30, ipady=40)

        # 执行换算器
        app = Converter(tab2)

        # 运行Tkinter事件循环
        root.mainloop()

优化版v1.5

import os
from tkinter import filedialog, simpledialog, messagebox, ttk
from tkinter import *
import tkinter as tk


# 定义一个函数来增加文件的大小


def increase_file_size(file_path, target_size):
    padding = b'\0' * (target_size - os.path.getsize(file_path))  # 计算需要添加的填充量
    with open(file_path, 'ab') as f:  # 以追加二进制模式打开文件
        f.write(padding)  # 写入填充


# 定义一个函数来浏览文件


def browse_files():
    filename = filedialog.askopenfilename(initialdir="/", title="选择文件")  # 打开一个文件对话框来选择文件
    if filename:  # 如果文件名存在
        file_path.set(filename)  # 更新文件路径
        selected_file_label.config(text=filename)  # 更新标签显示的文件名


# 定义一个函数来移除所选文件


def remove_file():
    file_path.set("")  # 清空文件路径
    selected_file_label.config(text="")  # 清空标签显示的文件名


# 定义一个函数来开始生成


def start_generate():
    if file_path.get() and target_size_var.get():  # 如果文件路径和目标大小都存在
        increase_file_size(file_path.get(), int(target_size_var.get()))  # 增加文件大小
        messagebox.showinfo("恭喜", "我很棒吧!扩充成功啦~")  # 显示成功消息


class Converter:
    def __init__(self, master):
        self.master = master
        # self.master.title('Byte Converter')
        # 定义转换字典
        self.units = {'B': 1, 'KB': 1024, 'MB': 1048576, 'GB': 1073741824, 'TB': 1099511627776}
        # 创建输入框
        self.input_value = tk.StringVar()
        self.entry = tk.Entry(master, textvariable=self.input_value)
        self.entry.grid(row=0, column=0, padx=(10, 0), pady=10)
        # 创建单位下拉菜单
        self.unit_value = tk.StringVar(value='MB')
        self.unit_combo = ttk.Combobox(master, textvariable=self.unit_value)
        self.unit_combo['values'] = list(self.units.keys())
        self.unit_combo.grid(row=0, column=1, padx=(2, 0))
        # 创建目标单位下拉菜单
        self.target_unit_value = tk.StringVar(value='B')
        self.target_unit_combo = ttk.Combobox(master, textvariable=self.target_unit_value)
        self.target_unit_combo['values'] = list(self.units.keys())
        self.target_unit_combo.grid(row=0, column=2, padx=(2, 0))
        # 创建结果标签,font属性调整字体大小
        self.result_label = tk.Label(master, text='', font=('Times', 20, 'bold'))
        self.result_label.grid(row=1, column=0, columnspan=4, ipady=30)
        # 创建计算按钮
        self.calc_button = tk.Button(master, text='计算', command=self.calculate)
        self.calc_button.grid(row=2, column=0, rowspan=2, padx=10, ipadx=50, ipady=10)
        # 创建复制按钮
        self.copy_button = tk.Button(master, text='复制', command=self.copy_to_clipboard)
        self.copy_button.grid(row=2, column=2, rowspan=2, padx=10, ipadx=50, ipady=10)

    def calculate(self):
        try:
            value = float(self.input_value.get())
            unit = self.unit_value.get()
            target_unit = self.target_unit_value.get()
            bytes = value * self.units[unit]
            result = int(bytes / self.units[target_unit])
            self.result_label.config(text=str(result))
        except ValueError:
            messagebox.showerror("出错啦", "大笨蛋,输入你要换算的数值呀!")
        except KeyError:
            messagebox.showerror("出错啦", "大笨蛋,选择你要换算的单位呀!")

    def copy_to_clipboard(self):
        self.master.clipboard_clear()
        self.master.clipboard_append(self.result_label.cget("text"))
        messagebox.showinfo("恭喜", "我很棒吧!已经复制到剪切板啦~")  # 显示成功消息


# 创建一个Tk窗口
root = Tk()
# 定义窗口的默认大小
root.geometry("494x230+800+300")  # 设置窗口默认大小,后面俩参数是默认位置坐标
# 修改为自定义的窗口图标
# root.iconbitmap('aaa.ico')
# 工具名为“文件大小扩充器”
root.title('文件扩充器V1.5')
tab_control = ttk.Notebook(root)
tab1 = ttk.Frame(tab_control)
tab_control.add(tab1, text='扩充功能')
tab2 = ttk.Frame(tab_control)
tab_control.add(tab2, text='换算功能')
tab_control.pack(expand=1, fill='both')
# 创建一个变量来存储目标大小
target_size_var = StringVar()
# 创建一个标签,显示字段名"目标大小",使用grid进行表格化管理,row行,column列
Label(tab1, text="目标大小(B):").grid(row=0, column=0, padx=(20, 0), pady=10)
# 创建一个输入框,输入目标大小
Entry(tab1, textvariable=target_size_var).grid(row=0, column=1, columnspan=2)
# 创建一个变量来存储文件路径
file_path = StringVar()
# 创建一个标签,显示字段名"选择文件"
Label(tab1, text="选择文件:").grid(row=1, column=0, padx=(20, 0), pady=10)
# 创建一个【点击选择】按钮,点击时会调用browse_files函数
Button(tab1, text="点击选择", command=browse_files).grid(row=1, column=1)
# 创建一个【取消选择】按钮,点击时会调用remove_file函数
Button(tab1, text="取消选择", command=remove_file).grid(row=1, column=2)
# 创建一个标签来显示所选文件名,wraplength设置450px后自动换行
selected_file_label = Label(tab1, text="", wraplength=450)
selected_file_label.grid(row=2, column=0, columnspan=12, padx=(10, 0))
# 创建一个按钮,点击时会调用start_generate函数
Button(tab1, text="开始生成", font=("Times", 20), command=start_generate).grid(row=0, column=8, rowspan=2, columnspan=3,
                                                                               padx=(20, 0), ipadx=30)
# 执行换算器
app = Converter(tab2)
# 运行Tkinter事件循环
root.mainloop()

打包,便于项目组其他成员直接使用

pyinstaller -F -w -i bbb.ico upFile.py

pyinstaller (这个是打包exe文件使用的模块)
-F (这个是生成exe文件的,F 一定要用大写,不然就会失败,所以必须要)
-w (这个的话小写也可以,主要是解决打包后,运行文件会有黑框框闪过,建议是加上)
-i (这个是用于替换你的应用程序桌面图标,把文件图标替换成你想要的样子,可加可不加,要求ico格式,32*32,否则可能失败)
aaa.ico (这个是你准备好要替换的图标名字+格式,切记用英文,两三个最好,别用单个的字母,有些字母会导致不成功)
zzz.py (这个是你的代码文件名字,放在最后)
怎么用?

扩充功能

  1. image.png
  2. 目标大小:单位B,输入你想将此文件调整到多大,可使用换算功能进行换算;
  3. 文件类型:可下拉选择,若无此类型,可选择其他,然后输入你想修改的类型即可;
  4. 选择文件:点击选择可选择该类型的文件,选择后点击开始生成,即可将此文件扩充为目标大小;若点击取消选择,可移除已选择的文件重新选择;
  5. 换算功能
    1. image.png
    2. 第一项:输入你想换算的数值;
    3. 第二项:选择你想换算的数值单位;
    4. 第三项:选择你想换算成的数值单位;
    5. 比如:你想知道2M=多少B,输入内容后,点击计算即可生成结果,点击复制可快速复制结果;
  6. Tips:项目测试中,需要的文件可提前准备,制作文件库进行积累,方便后续测试。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

苏虞北念

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值