为什么做?
- 上传测试经常需要各种类型、不同大小的文件,但收集起来相当麻烦,且大小不能满足刚好到边界值;
- 测试时间经常很紧,测试数据可提前准备,便于测试;
- 上传文件最好是校验16进制的文件头,而不是直接校验后缀。
- 需求:能生成指定大小(精确到B)、类型(支持任意类型)且可正常打开的文件。
- ❌直接改后缀;
- ❌空文件生成器;(无法通过16进制头部信息校验)
怎么做?
- 思路:提前收集各类型中较小的文件,比如200K,在文件后扩充空字节,使其达到指定大小。
- 初版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 (这个是你的代码文件名字,放在最后)
怎么用?
扩充功能
- 目标大小:单位B,输入你想将此文件调整到多大,可使用换算功能进行换算;
- 文件类型:可下拉选择,若无此类型,可选择其他,然后输入你想修改的类型即可;
- 选择文件:点击选择可选择该类型的文件,选择后点击开始生成,即可将此文件扩充为目标大小;若点击取消选择,可移除已选择的文件重新选择;
- 换算功能
- 第一项:输入你想换算的数值;
- 第二项:选择你想换算的数值单位;
- 第三项:选择你想换算成的数值单位;
- 比如:你想知道2M=多少B,输入内容后,点击计算即可生成结果,点击复制可快速复制结果;
- Tips:项目测试中,需要的文件可提前准备,制作文件库进行积累,方便后续测试。