功能就是实时看牛马费,以及可以计算还剩多少天发牛马费。

1111.png (10.69 KB, 下载次数: 0)
下载附件
2025-5-7 21:12 上传
运行后会生成一个json的配置文件,启动和结束工作会生成一个当天数据的json文件,其他没啥东西~~~
[Python] 纯文本查看 复制代码import tkinter as tk
from tkinter import ttk, messagebox
import json
import os
from datetime import datetime, timedelta
class SalaryCalculator:
def __init__(self):
self.root = tk.Tk()
self.root.title("工资实时计算机")
self.root.resizable(True, True)
self.center_window(400, 245)
# 初始化状态
self.current_frame = None
self.running = False
self.start_time = None
self.total_earned = 0.0
self.elapsed_seconds = 0
self.daily_data = {}
# 文件配置
self.config_file = "work_config.json"
self.json_filename = f"data_{datetime.now().strftime('%Y-%m-%d')}.json"
self.config = self.load_config()
# 创建界面
self.create_input_frame()
self.create_work_frame()
self.load_daily_data()
# 启动检测
self.switch_frame(self.input_frame)
self.root.protocol("WM_DELETE_WINDOW", self.on_close)
self.check_payday()
self.root.mainloop()
def center_window(self, width, height):
screen_width = self.root.winfo_screenwidth()
screen_height = self.root.winfo_screenheight()
x = (screen_width - width) // 2
y = (screen_height - height) // 2
self.root.geometry(f"{width}x{height}+{x}+{y}")
def create_input_row(self, parent, label_text, config_key):
frame = ttk.Frame(parent)
label = ttk.Label(frame, text=label_text, width=15, anchor="e")
label.pack(side=tk.LEFT, padx=5)
entry = ttk.Entry(frame, validate="key")
val_func = self.validate_payday if config_key == 'payday' else self.validate_number
entry['validatecommand'] = (entry.register(val_func), '%P')
entry.insert(0, str(self.config[config_key]))
entry.pack(side=tk.RIGHT, expand=True, fill=tk.X, padx=5)
frame.pack(fill=tk.X, pady=5)
return entry
def create_input_frame(self):
self.input_frame = ttk.Frame(self.root, padding=20)
self.salary_entry = self.create_input_row(self.input_frame, "月薪(人民币):", "monthly_salary")
self.hours_entry = self.create_input_row(self.input_frame, "每日工作时长(小时):", "daily_hours")
self.days_entry = self.create_input_row(self.input_frame, "每月工作天数:", "work_days")
self.payday_entry = self.create_input_row(self.input_frame, "发薪日(1-31):", "payday")
ttk.Separator(self.input_frame, orient=tk.HORIZONTAL).pack(fill=tk.X, pady=10)
self.start_btn = ttk.Button(self.input_frame, text="开始工作", command=self.start_work)
self.start_btn.pack(fill=tk.X, pady=5)
def create_work_frame(self):
self.work_frame = ttk.Frame(self.root, padding=20)
# 状态显示
status_box = ttk.Frame(self.work_frame)
self.status_label = ttk.Label(status_box, text="正在上班中", font=('Arial', 14, 'bold'))
self.status_label.pack(pady=5)
status_box.pack(fill=tk.X)
# 发薪状态提示
self.payday_box = ttk.Frame(self.work_frame)
self.payday_label = ttk.Label(
self.payday_box,
text="",
font=('Arial', 12, 'bold'),
foreground='#FF6600'
)
self.payday_label.pack()
self.payday_box.pack(fill=tk.X, pady=5)
# 时间显示
time_box = ttk.Frame(self.work_frame)
self.time_label = ttk.Label(time_box, text="00:00:00:00", font=('Arial', 24))
self.time_label.pack()
time_box.pack(expand=True, fill=tk.BOTH)
# 金额显示
earned_box = ttk.Frame(self.work_frame)
self.earned_label = ttk.Label(earned_box, text="已挣取:0.00 元", font=('Arial', 12))
self.earned_label.pack()
earned_box.pack(fill=tk.X)
# 操作按钮
btn_box = ttk.Frame(self.work_frame)
self.stop_btn = ttk.Button(btn_box, text="结束工作", command=self.stop_work)
self.stop_btn.pack(fill=tk.X)
btn_box.pack(fill=tk.X, pady=10)
def validate_number(self, value):
return value.replace('.', '', 1).isdigit() or value == ""
def validate_payday(self, value):
return value.isdigit() and 1