徐州麦克技术服务有限公司天津八里台工业园区地区分站 - 提供专业的解决方案!

天津八里台工业园区

当前位置: 天津八里台工业园区 > 政策法规 > 文章页

优秀牛马自我驱动

时间:2025-09-01 01:18来源:网络编辑:天津八里台工业园区 点击: 6 次
工资实时计算机,刷的短视频,看着挺好玩的,就diy了一下功能就是实时看牛马费,以及可以计算还剩多少天发牛马费。运行后会生成一个json的配置文件,启动和结束工作 ...

本帖最后由 浮影 于 2025-5-7 21:13 编辑

工资实时计算机,刷的短视频,看着挺好玩的,就diy了一下
功能就是实时看牛马费,以及可以计算还剩多少天发牛马费。

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 <= int(value) <= 31 if value else False def load_config(self): default_config = { "monthly_salary": 0.0, "daily_hours": 0.0, "work_days": 0.0, "payday": 15 } if os.path.exists(self.config_file): try: with open(self.config_file, 'r') as f: loaded_config = json.load(f) if not (1 <= loaded_config.get('payday', 15) <= 31): loaded_config['payday'] = 15 messagebox.showwarning("配置错误", "发薪日必须在1-31之间,已重置为15号") return {**default_config, **loaded_config} except Exception as e: messagebox.showerror("错误", f"配置文件损坏: {str(e)}") self.save_config(default_config) return default_config def save_config(self, config=None): if config is None: config = self.config with open(self.config_file, 'w') as f: json.dump(config, f, indent=2) def load_daily_data(self): if os.path.exists(self.json_filename): try: with open(self.json_filename, 'r') as f: self.daily_data = json.load(f) self.elapsed_seconds = self.daily_data.get('elapsed_seconds', 0) self.total_earned = self.daily_data.get('total_earned', 0) self.start_time = datetime.strptime( self.daily_data['start_time'], '%Y-%m-%d %H:%M:%S' ) if self.start_time.date() == datetime.now().date(): self.running = True except: messagebox.showerror("错误", "当日数据文件损坏,已重置") def save_daily_data(self): data = { 'start_time': datetime.now().strftime('%Y-%m-%d %H:%M:%S'), 'elapsed_seconds': self.elapsed_seconds, 'total_earned': self.total_earned } with open(self.json_filename, 'w') as f: json.dump(data, f) def calculate_salary(self): hourly_rate = self.config["monthly_salary"] / ( self.config["work_days"] * self.config["daily_hours"] ) return hourly_rate / 3600 * self.elapsed_seconds def update_timer(self): if self.running: self.elapsed_seconds += 1 hours, rem = divmod(self.elapsed_seconds, 3600) mins, secs = divmod(rem, 60) days, hours = divmod(hours, 24) self.time_label.config(text=f"{days:02}:{hours:02}:{mins:02}:{secs:02}") self.total_earned = self.calculate_salary() self.earned_label.config(text=f"已挣取:{self.total_earned:.2f} 元") self.root.after(1000, self.update_timer) def last_day_of_month(self, date): if date.month == 12: return date.replace(day=31) return date.replace(month=date.month+1, day=1) - timedelta(days=1) def calculate_next_payday(self): today = datetime.now() payday = min( int(self.config.get('payday', 15)), self.last_day_of_month(today).day ) current_month_payday = today.replace(day=payday) return current_month_payday if today <= current_month_payday else \ (today.replace(day=28) + timedelta(days=4)).replace( day=min(payday, self.last_day_of_month(today).day)) def check_payday(self): today = datetime.now() try: payday = int(self.config.get('payday', 15)) current_payday = today.replace(day=min(payday, self.last_day_of_month(today).day)) if today.date() == current_payday.date(): self.payday_label.config( text="&#127881;wow,今天是发薪日!", foreground='#FF0000', font=('Arial', 14, 'bold') ) else: delta = (current_payday - today).days self.payday_label.config( text=f"距离下次发薪还有 {delta} 天", foreground='#333333', font=('Arial', 12) ) except Exception as e: print(f"发薪日检测错误: {str(e)}") self.root.after(3600000, self.check_payday) # 每小时检查 def start_work(self): try: new_config = { "monthly_salary": float(self.salary_entry.get()), "daily_hours": float(self.hours_entry.get()), "work_days": float(self.days_entry.get()), "payday": int(self.payday_entry.get()) } except ValueError: messagebox.showerror("错误", "请输入有效的数字") return if any(value <= 0 for value in list(new_config.values())[:-1]) or not (1 <= new_config['payday'] <= 31): messagebox.showerror("错误", "所有数值必须大于0且发薪日为1-31") return self.config.update(new_config) self.save_config() self.running = True self.start_time = datetime.now() self.switch_frame(self.work_frame) self.update_timer() self.check_payday() def stop_work(self): self.running = False self.save_daily_data() self.elapsed_seconds = 0 self.total_earned = 0 self.switch_frame(self.input_frame) def switch_frame(self, frame): if self.current_frame: self.current_frame.pack_forget() self.current_frame = frame self.current_frame.pack(expand=True, fill=tk.BOTH) def on_close(self): if self.running: self.save_daily_data() self.root.destroy() if __name__ == "__main__": SalaryCalculator()


 

免费评分 参与人数 10吾爱币 +16 热心值 +9 理由

苏紫方璇
  + 7   + 1   欢迎分析讨论交流,吾爱破解论坛有你更精彩!  

xlln
  + 1   + 1   我很赞同!  

huxiaoheng4567
  + 1   + 1   用心讨论,共获提升!  

10830
  + 1   + 1   我很赞同!  

BTCQAQ
  + 1     感谢发布原创作品,吾爱破解论坛因你更精彩!  

zhuoao
  + 1   + 1   感谢发布原创作品,吾爱破解论坛因你更精彩!  

laozhang4201
  + 1   + 1   热心回复!  

xwz2058
  + 1   + 1   我很赞同!  

beihai1314
  + 1   + 1   我很赞同!  

helh0275
  + 1   + 1   感谢发布原创作品,吾爱破解论坛因你更精彩!  

查看全部评分


(提示:天津八里台工业园区麦克技术服务有限公司为您提供天津八里台工业园区专业的劳务派遣公司、天津八里台工业园区劳务外包公司、天津八里台工业园区最好的劳务派遣公司、天津八里台工业园区劳务服务外包公司、天津八里台工业园区物业管理服务、天津八里台工业园区保安服务、天津八里台工业园区人事代理、天津八里台工业园区人力资源外包服务公司、天津八里台工业园区区域人力资源服务商)
------分隔线----------------------------
栏目列表
推荐内容
  • 《中华人民共和国社会保险法》培训解读课件.pptx

    《中华人民共和国社会保险法》培训解读课件.pptx,202X《中华人民共和国社会保险法》培训解读主讲人:2025.5时间: 01法律概述02社会保险的种类与覆盖...

  • 劳务关系

    劳务关系是劳动者与用工者根据口头或书面约定,由劳动者向用工者提供一次性的或者是特定的劳动服务,用工者依约向劳动者支付劳务报酬的一种有偿服务的法律关系。...