电表及销售统计Python应用及win程序

news2024/9/25 21:29:54

暑假每天都要填表算账很烦躁,就整了个小程序来减轻压力

程序可以做到记录输入的每一条数据,并用新数据减去旧数据算新增的量,同时记录填写时间

Python代码

import json
import os  # 导入os模块
from datetime import datetime
from tkinter import *
from tkinter import messagebox
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
from matplotlib.figure import Figure
import matplotlib.pyplot as plt
# 初始化数据文件(如果文件不存在,则创建空字典)
def init_data_file(filename):
    if not os.path.exists(filename):
        with open(filename, 'w') as file:
            json.dump({}, file)

        # 读取数据


def read_data(filename):
    with open(filename, 'r') as file:
        return json.load(file)

    # 更新数据


def update_data(filename, data_name, new_value):
    data = read_data(filename)
    current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")

    if data_name not in data:
        data[data_name] = [
            {"time": current_time, "value": new_value, "difference": 0}
        ]
    else:
        last_record = data[data_name][-1]
        last_value = last_record["value"]
        difference = new_value - last_value
        data[data_name].append({
            "time": current_time,
            "value": new_value,
            "difference": difference
        })

    with open(filename, 'w') as file:
        json.dump(data, file, indent=4)

    # 主程序




# GUI主窗口
class DataApp:
    def __init__(self, master):
        self.master = master
        self.master.title("数据记录器")
        self.filename = 'data_records.json'
        self.init_data_file()

        # 创建输入框和按钮
        Label(master, text="数据名称:").grid(row=0)
        self.data_name_entry = Entry(master)
        self.data_name_entry.grid(row=0, column=1)

        Label(master, text="数据值:").grid(row=1)
        self.data_value_entry = Entry(master)
        self.data_value_entry.grid(row=1, column=1)

        self.update_button = Button(master, text="更新数据", command=self.update_data_gui)
        self.update_button.grid(row=2, column=1)
        self.analyze_button = Button(master, text="分析数据", command=self.analyze_data)
        self.analyze_button.grid(row=3, column=1)
        self.clear_button = Button(master, text="清空数据库", command=self.clear_data)
        self.clear_button.grid(row=6, column=1)

        self.quit_button = Button(master, text="退出", command=master.quit)
        self.quit_button.grid(row=4, column=1)

        # 图表区域
        self.figure = Figure(figsize=(6, 4), dpi=100)
        self.ax = self.figure.add_subplot(111)
        self.canvas = FigureCanvasTkAgg(self.figure, master=master)
        self.canvas.get_tk_widget().grid(row=0, column=2, rowspan=5)
        self.quit_button = Button(master, text="图表退出", command=master.quit)
        self.quit_button.grid(row=5, column=1)

    # 数据清空功能
    def clear_data(self):
        confirm = messagebox.askyesno("警告", "您确定要清空所有数据吗?此操作不可逆!")
        if confirm:
            with open(self.filename, 'w') as file:
                json.dump({}, file)
            messagebox.showinfo("成功", "数据已清空。")
        else:
            messagebox.showinfo("取消", "数据清空操作已取消。")
    # 初始化数据文件
    def init_data_file(self):
        if not os.path.exists(self.filename):
            with open(self.filename, 'w') as file:
                json.dump({}, file)

    # GUI版本的更新数据函数
    def update_data_gui(self):
        data_name = self.data_name_entry.get()
        try:
            new_value = float(self.data_value_entry.get())
            update_data(self.filename, data_name, new_value)
            messagebox.showinfo("成功", f"数据 {data_name} 已更新,并记录了差值和时间。")
        except ValueError:
            messagebox.showerror("错误", "请输入有效的数字!")
# 数据分析图表函数
    def analyze_data(self):
        data_name = self.data_name_entry.get()
        data = read_data(self.filename)

        if data_name in data:
            times = [record["time"] for record in data[data_name]]
            values = [record["value"] for record in data[data_name]]
            differences = [record["difference"] for record in data[data_name]]

            self.ax.clear()
            self.ax.plot(times, values, label='Values', marker='o')  # 添加marker样式以便更清晰地看到点
            self.ax.plot(times, differences, label='Differences', marker='x')

            # 在每个点旁边添加数值标签
            for i, txt in enumerate(values):
                self.ax.text(times[i], values[i], f'{txt:.2f}', ha='center', va='bottom')

            for i, txt in enumerate(differences):
                self.ax.text(times[i], differences[i], f'{txt:.2f}', ha='center', va='top')

            self.ax.legend()
            self.ax.set_title(f"{data_name} Analysis")
            self.canvas.draw()
        else:
            messagebox.showerror("错误", f"数据名称 {data_name} 未找到!")

if __name__ == "__main__":
    root = Tk()
    app = DataApp(root)
    root.mainloop()

Python运行结果

查询数据

exe也做了一个

链接:https://pan.baidu.com/s/1YUkjP5Vs76tU9tzRmh_kZw?pwd=1111 
提取码:1111

过期或者下架了评论区提醒我补下。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1923911.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

防火墙NAT智能选举综合实验

目录 实验拓扑 实验要求 实验思路 实验配置 需求7 需求8 需求9 需求10 需求11 实验拓扑 实验要求 7.办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换) 8.分公司设备可以通过总公司的移动链路和电信链路访问到d…

Python数据分析案例52——基于SSA-LSTM的风速预测(麻雀优化)

案例背景 又要开始更新时间序列水论文的系列的方法了,前面基于各种不同神经网络层,还有注意力机制做了一些缝合模型。 其实论文里面用的多的可能是优化算法和模态分解,这两个我还没出专门的例子,这几天正好出一个优化算法的例子来…

RocketMQ~架构了解

简介 RocketMQ 具有高性能、高可靠、高实时、分布式 的特点。它是一个采用 Java 语言开发的分布式的消息系统,由阿里巴巴团队开发,在 2016 年底贡献给 Apache,成为了 Apache 的一个顶级项目。 在阿里内部,RocketMQ 很好地服务了集…

优化Cocos Creator 包体体积

优化Cocos Creator 包体体积 引言一、优化图片文件体积:二、优化声音文件体积:三、优化引擎代码体积:四、 优化字体字库文件大小: 引言 优化Cocos Creator项目的包体体积是一个常见且重要的任务,尤其是在移动设备和网…

【高中数学/幂函数】比较a=2^0.3,b=3^0.2,c=7^0.1的大小

【问题】 比较a2^0.3,b3^0.2,c7^0.1的大小 【解答】 a2^0.32^3/10(2^3)^1/108^1/10 b3^0.23^2/10(3^2)^1/109^1/10 c7^0.17^1/10 由于yx^1/10在x正半轴是增函数,底数大的得数就大。 因为9>8>7,所以b>a>c 【图像】 在图像上绘出曲线yx^1/10&…

红日靶场----(三)1.漏洞利用

上期已经信息收集阶段已经完成,接下来是漏洞利用。 靶场思路 通过信息收集得到两个吧靶场的思路 1、http://192.168.195.33/phpmyadmin/(数据库的管理界面) root/root 2、http://192.168.195.33/yxcms/index.php?radmin/index/login&am…

杆塔倾斜在线监测装置

概述 我国约960万平方公里已经基本实现电网和基站通讯全覆盖,但我国地貌复杂多样,大部分杆塔需要安装在野外,在安装时并不能保证地基的结实可靠,一不小心就可能导致杆塔的倾斜倒塌。 在通信铁塔倾斜现象发生发展的初期&#xff0…

HarmonyOS(43) @BuilderParam标签使用指南

BuilderParam BuilderParam使用举例定义模板定义具体实现BuilderParam初始化 demo源码参考资料 BuilderParam 该标签有的作用有点类似于设计模式中的模板模式,类似于指定一个UI占位符,具体的实现交给具体的Builder,顾名思义,可以…

面试内容集合

用例设计方法 (一)等价类划分  常见的软件测试面试题划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理…

腾讯云如何设置二级域名?

什么是二级域名? 例如我已申请的域名为: test.com //顶级域名 现在我开发的应用要部署到二级域名: blog.test.com 1、打开腾讯云控制台的我的域名,然后点击解析 2、在我的解析页面点击添加记录,然后需注意红色方框处…

js 请求blob:https:// 图片

方式1 def get_file_content_chrome(driver, uri):result driver.execute_async_script("""var uri arguments[0];var callback arguments[1];var toBase64 function(buffer){for(var r,nnew Uint8Array(buffer),tn.length,anew Uint8Array(4*Math.ceil(t/…

[WUSTCTF2020]funnyre

【【反调试】花指令patch与原理分析】https://www.bilibili.com/video/BV1mK411A75G?vd_source7ad69e0c2be65c96d9584e19b0202113 B站这个视频和这道题的花指令一样的 这个call百分之一万是辣鸡 重编译u他 经典辣鸡花指令 nop掉 下面一共有四处,一样的操作 然后回到main函…

奥利奥广告策略解析「扭一扭、舔一舔、泡一泡」广告为何深入人心?

作为一个多年的广告人,我认为奥利奥的「扭一扭、舔一舔、泡一泡」广告策略非常巧妙。今天可以从专业的角度来分析分析一下,大概应该有三大原因吧。 品牌识别度与记忆点: “扭一扭、舔一舔、泡一泡”这句广告语简洁易记,富有节奏…

如何30分钟下载完368G的Android系统源码?

如何30分钟下载完368G的Android系统源码? Android系统开发的一个痛点问题就是Android系统源码庞大,小则100G,大则,三四百G。如标题所言,本文介绍通过局域网高速网速下载源码的方法。 制作源码mirror 从源码git服务器A&#xff0c…

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理

AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 目录 AGI 之 【Hugging Face】 的【问答系统】的 [评估并改进问答Pipeline] / [ 生成式问答 ] 的简单整理 一、简单介绍 二、构建问答系统 三、评估并改进问答pipeline 1…

总结单例模式的写法

一、单例模式的概念 1.1 单例模式的概念 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。就是当前进程确保一个类全局只有一个实例。 1.2 单例模式的优…

【postgresql】时间函数和操作符

日期/时间操作符 加减操作符: 和 - 可以用于日期、时间、时间戳和时间间隔的加减操作。 SELECT 2024-01-01::date INTERVAL 1 day as "date"; ; -- 结果:2024-01-02SELECT 2024-01-01 12:00:00::timestamp - INTERVAL 2 hours as "…

泽众一站式性能测试平台P-One监控指标的意义

在当今数字化和信息化高度发展的时代,企业把保障系统稳定运行、优化业务流程和提升用户体验摆在首要位置。然而,在现如今复杂的分布式系统中,各个组件和服务之间的交互频繁且紧密,当系统出现性能瓶颈时,传统的监测手段…

Flutter 初识:导航控件

Flutter导航控件小结 路由与导航Navigator核心方法属性示例基本导航示例替换当前页面并推入新页面使用命名路由动态生成路由额外的导航功能 完整示例代码 MaterialPageRoute属性示例 CupertinoPageRoute属性示例 应用栏与底部导航AppBar属性解析示例 BottomNavigationBar属性解…

gorm只查询某一些字段字段的方法Select, 和只查询某一字段方法 Pluck

gorm中默认是查询所有字段的, 如果我们只需要获取某些字段的值,可以通过使用 Select方法来指定要查询的字段来实现, 也可以通过定义一个需要字段的结构体来实现; 而如果我们只需要查询某一个字段的值就可以使用 Pluck方法来获取(这…