当前位置: 代码网 > it编程>前端脚本>Python > 基于Python编写监控视频存储计算器

基于Python编写监控视频存储计算器

2024年12月20日 Python 我要评论
这篇文章主要来和大家介绍一下如何使用python开发一个简单的监控视频存储计算器,下面是示例代码,希望对大家有所帮助完整代码import tkinter as tkfrom tkinter impor

这篇文章主要来和大家介绍一下如何使用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监控视频存储计算器内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com