这篇文章主要来和大家介绍一下如何使用python开发一个简单的监控视频存储计算器,下面是示例代码,希望对大家有所帮助
完整代码
import tkinter as tk
from tkinter import ttk
import math
from tkinter.font import font
class storagecalculator:
def __init__(self, root):
self.root = root
self.root.title("监控视频存储计算器")
self.root.geometry("600x800")
self.root.configure(bg='#f0f0f0')
# 设置主题和样式
self.style = ttk.style()
self.style.theme_use('clam') # 使用clam主题作为基础
# 定义颜色方案
self.colors = {
'primary': '#2196f3', # 主色调
'secondary': '#64b5f6', # 次要色调
'bg': '#f0f0f0', # 背景色
'text': '#212121', # 文字颜色
'success': '#4caf50' # 成功色
}
# 设置自定义字体
self.title_font = font(family="微软雅黑", size=12, weight="bold")
self.normal_font = font(family="微软雅黑", size=10)
self.result_font = font(family="微软雅黑", size=11, weight="bold")
# 配置样式
self.style.configure('title.tlabel',
font=self.title_font,
background=self.colors['bg'],
foreground=self.colors['primary'])
self.style.configure('normal.tlabel',
font=self.normal_font,
background=self.colors['bg'])
self.style.configure('custom.tbutton',
font=self.normal_font,
background=self.colors['primary'],
padding=(20, 10))
self.style.configure('tab.tnotebook',
background=self.colors['bg'])
self.style.configure('result.tlabelframe',
background=self.colors['bg'])
# 创建主标题
self.create_header()
# 创建notebook
self.notebook = ttk.notebook(root, style='tab.tnotebook')
self.notebook.pack(fill='both', expand=true, padx=20, pady=(0, 20))
# 创建计算页面
self.create_forward_page()
self.create_reverse_page()
# 创建页脚
self.create_footer()
def create_header(self):
"""创建头部标题区域"""
header_frame = ttk.frame(self.root)
header_frame.pack(fill='x', padx=20, pady=20)
title = ttk.label(header_frame,
text="监控视频存储计算器",
style='title.tlabel')
title.pack()
subtitle = ttk.label(header_frame,
text="专业的存储空间评估工具",
style='normal.tlabel')
subtitle.pack()
def create_forward_page(self):
"""创建正向计算页面"""
self.forward_frame = ttk.frame(self.notebook, padding="20")
self.notebook.add(self.forward_frame, text=" 计算存储需求 ")
# 创建输入区域
input_frame = ttk.labelframe(self.forward_frame,
text="参数输入",
padding="15")
input_frame.pack(fill='x', padx=10, pady=5)
# 添加输入控件
self.create_input_field(input_frame, "摄像头数量:", 0, self.normal_font)
self.cameras = self.entry
self.create_input_field(input_frame, "每天录像时间(小时):", 1, self.normal_font)
self.hours = self.entry
self.hours.insert(0, "24") # 默认24小时
self.create_input_field(input_frame, "需要保存的天数:", 2, self.normal_font)
self.days = self.entry
# 摄像头类型选择
ttk.label(input_frame, text="摄像头类型:",
font=self.normal_font).grid(row=3, column=0,
sticky=tk.w, pady=5)
self.camera_type = ttk.combobox(input_frame, width=25,
font=self.normal_font)
self.camera_type['values'] = ['200万像素', '300万像素', '400万像素', '500万像素']
self.camera_type.current(0)
self.camera_type.grid(row=3, column=1, sticky=tk.w, pady=5)
# 编码方式选择
ttk.label(input_frame, text="编码方式:",
font=self.normal_font).grid(row=4, column=0,
sticky=tk.w, pady=5)
self.encoding = ttk.combobox(input_frame, width=25,
font=self.normal_font)
self.encoding['values'] = ['h.264', 'h.265']
self.encoding.current(1) # 默认h.265
self.encoding.grid(row=4, column=1, sticky=tk.w, pady=5)
# 计算按钮
btn_frame = ttk.frame(self.forward_frame)
btn_frame.pack(fill='x', pady=20)
calc_btn = ttk.button(btn_frame,
text="计算存储需求",
style='custom.tbutton',
command=self.calculate_forward)
calc_btn.pack(expand=true)
# 结果显示区域
self.forward_result_frame = ttk.labelframe(self.forward_frame,
text="计算结果",
padding="15",
style='result.tlabelframe')
self.forward_result_frame.pack(fill='x', padx=10, pady=5)
self.storage_label = ttk.label(self.forward_result_frame,
text="",
font=self.result_font)
self.storage_label.pack(anchor=tk.w)
self.recommendation_label = ttk.label(self.forward_result_frame,
text="",
font=self.result_font)
self.recommendation_label.pack(anchor=tk.w)
def create_reverse_page(self):
"""创建反向计算页面"""
self.reverse_frame = ttk.frame(self.notebook, padding="20")
self.notebook.add(self.reverse_frame, text=" 计算存储时间 ")
# 创建输入区域
input_frame = ttk.labelframe(self.reverse_frame,
text="参数输入",
padding="15")
input_frame.pack(fill='x', padx=10, pady=5)
# 添加输入控件
self.create_input_field(input_frame, "硬盘容量(tb):", 0, self.normal_font)
self.storage_size = self.entry
self.create_input_field(input_frame, "摄像头数量:", 1, self.normal_font)
self.rev_cameras = self.entry
self.create_input_field(input_frame, "每天录像时间(小时):", 2, self.normal_font)
self.rev_hours = self.entry
# 摄像头类型选择
ttk.label(input_frame, text="摄像头类型:",
font=self.normal_font).grid(row=3, column=0,
sticky=tk.w, pady=5)
self.rev_camera_type = ttk.combobox(input_frame, width=25,
font=self.normal_font)
self.rev_camera_type['values'] = ['200万像素', '300万像素', '400万像素', '500万像素']
self.rev_camera_type.current(0)
self.rev_camera_type.grid(row=3, column=1, sticky=tk.w, pady=5)
# 编码方式选择
ttk.label(input_frame, text="编码方式:",
font=self.normal_font).grid(row=4, column=0,
sticky=tk.w, pady=5)
self.rev_encoding = ttk.combobox(input_frame, width=25,
font=self.normal_font)
self.rev_encoding['values'] = ['h.264', 'h.265']
self.rev_encoding.current(1) # 默认h.265
self.rev_encoding.grid(row=4, column=1, sticky=tk.w, pady=5)
# 计算按钮
btn_frame = ttk.frame(self.reverse_frame)
btn_frame.pack(fill='x', pady=20)
calc_btn = ttk.button(btn_frame,
text="计算可存储天数",
style='custom.tbutton',
command=self.calculate_reverse)
calc_btn.pack(expand=true)
# 结果显示区域
self.reverse_result_frame = ttk.labelframe(self.reverse_frame,
text="计算结果",
padding="15",
style='result.tlabelframe')
self.reverse_result_frame.pack(fill='x', padx=10, pady=5)
self.days_label = ttk.label(self.reverse_result_frame,
text="",
font=self.result_font)
self.days_label.pack(anchor=tk.w)
def create_footer(self):
"""创建页脚"""
footer = ttk.label(self.root,
text="© 2024 专业视频监控存储解决方案",
style='normal.tlabel')
footer.pack(pady=10)
def create_input_field(self, parent, label_text, row, font):
"""创建统一的输入字段"""
ttk.label(parent, text=label_text,
font=font).grid(row=row, column=0,
sticky=tk.w, pady=5)
self.entry = ttk.entry(parent, width=25,
font=font)
self.entry.grid(row=row, column=1, sticky=tk.w, pady=5)
return self.entry
def calculate_storage(self, cameras, hours_per_day, days, camera_type, encoding):
"""
计算存储需求
camera_type: 摄像头类型 (200万/300万/400万/500万)
encoding: 编码方式 (h.264/h.265)
"""
# 每天存储空间(gb)
daily_storage = {
'200万像素': {
'h.264': 42.19, # 4096kbps
'h.265': 21.09 # 2048kbps
},
'300万像素': {
'h.264': 42.19, # 4096kbps
'h.265': 21.09 # 2048kbps
},
'400万像素': {
'h.264': 42.19, # 4096kbps
'h.265': 21.09 # 2048kbps
},
'500万像素': {
'h.264': 63.28, # 6144kbps
'h.265': 31.64 # 3072kbps
}
}
# 计算单个摄像头每天实际存储量
daily_per_camera = daily_storage[camera_type][encoding] * (hours_per_day / 24)
# 计算总存储量
total_storage_gb = daily_per_camera * cameras * days
# 转换为tb并返回
return round(total_storage_gb / 1024, 2)
def calculate_days(self, storage_tb, cameras, hours_per_day, camera_type, encoding):
"""
计算可存储天数
"""
daily_storage = {
'200万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'300万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'400万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'500万像素': {
'h.264': 63.28,
'h.265': 31.64
}
}
# 计算单个摄像头每天实际存储量
daily_per_camera = daily_storage[camera_type][encoding] * (hours_per_day / 24)
# 计算可存储天数
total_gb = storage_tb * 1024
days = total_gb / (daily_per_camera * cameras)
return round(days, 1)
def calculate_forward(self):
try:
cameras = int(self.cameras.get())
hours = float(self.hours.get())
days = int(self.days.get())
camera_type = self.camera_type.get()
encoding = self.encoding.get()
if cameras <= 0 or hours <= 0 or days <= 0:
raise valueerror("请输入大于0的数值")
# 获取单个摄像头每天的存储量
daily_storage = {
'200万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'300万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'400万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'500万像素': {
'h.264': 63.28,
'h.265': 31.64
}
}
daily_per_camera = daily_storage[camera_type][encoding] * (hours / 24)
daily_total = daily_per_camera * cameras
storage = self.calculate_storage(cameras, hours, days, camera_type, encoding)
self.storage_label.config(
text=f"每天存储空间: {round(daily_total, 2)} gb/天\n"
f"总存储容量: {storage} tb",
foreground=self.colors['success'])
self.recommendation_label.config(
text=f"建议配置: {math.ceil(storage)} tb 硬盘\n"
f"(基于{camera_type}摄像头,{encoding}编码)\n"
f"单个摄像头: {round(daily_per_camera, 2)} gb/天",
foreground=self.colors['success'])
except valueerror as e:
self.storage_label.config(
text="输入错误!",
foreground='red')
self.recommendation_label.config(
text="请检查输入的数值是否正确",
foreground='red')
def calculate_reverse(self):
try:
storage = float(self.storage_size.get())
cameras = int(self.rev_cameras.get())
hours = float(self.rev_hours.get())
camera_type = self.rev_camera_type.get()
encoding = self.rev_encoding.get()
if storage <= 0 or cameras <= 0 or hours <= 0:
raise valueerror("请输入大于0的数值")
# 获取单个摄像头每天的存储量
daily_storage = {
'200万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'300万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'400万像素': {
'h.264': 42.19,
'h.265': 21.09
},
'500万像素': {
'h.264': 63.28,
'h.265': 31.64
}
}
daily_per_camera = daily_storage[camera_type][encoding] * (hours / 24)
daily_total = daily_per_camera * cameras
days = self.calculate_days(storage, cameras, hours, camera_type, encoding)
self.days_label.config(
text=f"每天存储空间: {round(daily_total, 2)} gb/天\n"
f"单个摄像头: {round(daily_per_camera, 2)} gb/天\n"
f"可存储天数: {days} 天\n"
f"约等于 {round(days/30, 1)} 个月 或 {round(days/365, 1)} 年\n"
f"(基于{camera_type}摄像头,{encoding}编码)",
foreground=self.colors['success'])
except valueerror as e:
self.days_label.config(
text="输入错误!\n请检查输入的数值是否正确",
foreground='red')
def main():
root = tk.tk()
app = storagecalculator(root)
root.mainloop()
if __name__ == "__main__":
main()效果图

到此这篇关于基于python编写监控视频存储计算器的文章就介绍到这了,更多相关python监控视频存储计算器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论