python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python退休时间计算器

Python结合Tkinter实现法定退休时间计算器

作者:幸福清风

这篇文章主要介绍了如何基于Python Tkinter开发一款可视化法定退休时间计算器,程序集成官方权威退休算法,支持男职工、女职工(50岁)、女职工(55岁)三类人群计算,感兴趣的小伙伴可以了解下

前言

随着延迟退休政策正式落地,精准计算个人法定退休时间成为大众刚需。手动计算不仅繁琐易出错,还无法实时获取退休倒计时,难以直观感知退休时间节点。

本文基于Python Tkinter开发一款可视化法定退休时间计算器,程序集成官方权威退休算法,支持男职工、女职工(50岁)、女职工(55岁)三类人群计算,具备精准退休日期推算、实时倒计时展示、全屏沉浸式查看等核心功能,界面简洁易用、计算结果权威准确,无需复杂配置即可直接运行,完美解决个人退休时间查询痛点,兼具实用性与便捷性。

一、核心功能与主要工作内容总结

本程序采用GUI图形化界面+核心算法分离设计,整体开发工作围绕三大核心模块展开:

程序最终实现六大实用功能:

二、程序制作具体步骤(完整开发流程)

步骤1:环境准备与依赖库导入

程序基于Python原生环境开发,仅需安装一个第三方库处理日期差值,无需复杂环境配置:

import tkinter as tk
from tkinter import ttk, messagebox
from datetime import datetime
from dateutil.relativedelta import relativedelta

步骤2:编写官方权威退休计算核心函数

这是程序的核心逻辑,严格按照官方延迟退休规则编写calc_real_retirement函数:

步骤3:搭建主界面框架(Tkinter类封装)

创建RetirementUI类继承tk.Tk,实现界面模块化管理:

步骤4:实现核心交互功能

步骤5:开发全屏沉浸式效果

编写toggle_fullscreenexit_fullscreen方法,实现一键全屏功能:

步骤6:程序启动与测试

编写主程序入口,实例化界面类并启动主循环,测试全功能:

三、程序核心亮点

四、完整代码

# -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk, messagebox
from datetime import datetime
from dateutil.relativedelta import relativedelta
# ===================== 【官方权威算法】 =====================
def calc_real_retirement(gender_type, birth_year, birth_month):
    birth_date = datetime(birth_year, birth_month, 1)
    if gender_type == "男职工":
        base_age = 60
        delay_months = 0 if birth_year <= 1965 else min((birth_year - 1965) * 3, 36)
    elif gender_type == "女职工(50岁)":
        base_age = 50
        delay_months = 0 if birth_year <= 1970 else min((birth_year - 1970) * 2 + 1, 60)
    elif gender_type == "女职工(55岁)":
        base_age = 55
        delay_months = 0 if birth_year <= 1965 else min((birth_year - 1965) * 3, 36)
    else:
        base_age = 60
        delay_months = 0
    retire_base = birth_date + relativedelta(years=base_age)
    final_retire = retire_base + relativedelta(months=delay_months)
    total_month = base_age * 12 + delay_months
    return {
        "base_age": base_age,
        "delay_month": delay_months,
        "final_age": f"{total_month // 12}岁{total_month % 12}个月",
        "retire_date": f"{final_retire.year}年{final_retire.month:02d}月",
        "retire_datetime": final_retire
    }
# ===================== 主界面 =====================
class RetirementUI(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("法定退休时间计算器")
        self.geometry("1200x420")
        self.resizable(True, True)
        self.configure(bg="#f5f7fa")
        self.fullscreen = False
        self.bind("<F11>", self.toggle_fullscreen)
        self.bind("<Escape>", self.exit_fullscreen)
        self.main_frame = tk.Frame(self, bg="#f5f7fa")
        self.main_frame.pack(fill="both", expand=True, padx=10, pady=10)
        # 左侧输入区
        self.left_frame = tk.Frame(self.main_frame, bg="white", bd=0)
        self.left_frame.pack(side="left", fill="both", expand=True, padx=5, pady=5)
        tk.Label(self.left_frame, text="退休信息输入", font=("微软雅黑", 17, "bold"), bg="white").pack(pady=22)
        tk.Label(self.left_frame, text="身份类型", bg="white", font=("微软雅黑", 13)).place(relx=0.12, rely=0.18)
        self.type_var = tk.StringVar(value="女职工(50岁)")
        ttk.Combobox(self.left_frame, textvariable=self.type_var,
                     values=["男职工", "女职工(50岁)", "女职工(55岁)"],
                     state="readonly", font=("微软雅黑", 12), width=20).place(relx=0.4, rely=0.18)
        tk.Label(self.left_frame, text="出生年份", bg="white", font=("微软雅黑", 13)).place(relx=0.12, rely=0.32)
        self.year_var = tk.StringVar(value="1977")
        ttk.Entry(self.left_frame, textvariable=self.year_var, font=("微软雅黑", 12), width=22).place(relx=0.4,
                                                                                                      rely=0.32)
        tk.Label(self.left_frame, text="出生月份", bg="white", font=("微软雅黑", 13)).place(relx=0.12, rely=0.46)
        self.month_var = tk.StringVar(value="6")
        ttk.Entry(self.left_frame, textvariable=self.month_var, font=("微软雅黑", 12), width=22).place(relx=0.4,
                                                                                                       rely=0.46)
        self.res_text = tk.StringVar(value="请点击计算")
        tk.Label(self.left_frame, textvariable=self.res_text, font=("微软雅黑", 13),
                 bg="white", fg="#e53935", justify=tk.LEFT).place(relx=0.12, rely=0.6)
        ttk.Button(self.left_frame, text="开始计算", command=self.do_calc, width=22).place(relx=0.35, rely=0.87)
        # 右侧倒计时
        self.right_frame = tk.Frame(self.main_frame, bg="white", bd=0)
        self.right_frame.pack(side="right", fill="both", expand=True, padx=5, pady=5)
        self.title_label = tk.Label(self.right_frame, text="退休倒计时", font=("微软雅黑", 17, "bold"), bg="white")
        self.title_label.pack(pady=22)
        self.tip = tk.Label(self.right_frame, text="F11全屏 | ESC退出", font=("微软雅黑", 10), bg="white", fg="gray")
        self.tip.pack()
        self.block_frame = tk.Frame(self.right_frame, bg="white")
        self.block_frame.pack(pady=40, fill="both", expand=True)
        self.days = self.make_block(self.block_frame, "天", "000", 0)
        self.hours = self.make_block(self.block_frame, "时", "00", 1)
        self.mins = self.make_block(self.block_frame, "分", "00", 2)
        self.secs = self.make_block(self.block_frame, "秒", "00", 3)
        self.target = None
        self.update_timer()
    def make_block(self, parent, unit, val, col):
        frame = tk.Frame(parent, bg="#0078D7", bd=1, relief="solid")
        frame.grid(row=0, column=col, padx=10, sticky="nsew")
        parent.grid_columnconfigure(col, weight=1)
        num = tk.Label(frame, text=val, font=("微软雅黑", 46, "bold"), bg="#0078D7", fg="white")
        num.pack(pady=8, expand=True, fill="both")
        lbl = tk.Label(frame, text=unit, font=("微软雅黑", 18), bg="#0078D7", fg="white")
        lbl.pack(pady=4)
        return num
    def do_calc(self):
        try:
            y = int(self.year_var.get())
            m = int(self.month_var.get())
            r = calc_real_retirement(self.type_var.get(), y, m)
            self.res_text.set(
                f"基础退休年龄:{r['base_age']}岁\n"
                f"推迟月数:{r['delay_month']}个月\n"
                f"最终退休年龄:{r['final_age']}\n"
                f"退休日期:{r['retire_date']}"
            )
            self.target = r["retire_datetime"]
        except:
            messagebox.showerror("错误", "输入格式错误")
    def update_timer(self):
        if self.target:
            now = datetime.now()
            diff = self.target - now
            if diff.total_seconds() > 0:
                d, h, m, s = diff.days, diff.seconds // 3600, (diff.seconds % 3600) // 60, diff.seconds % 60
                self.days.config(text=f"{d:03d}")
                self.hours.config(text=f"{h:02d}")
                self.mins.config(text=f"{m:02d}")
                self.secs.config(text=f"{s:02d}")
            else:
                self.days.config(text="000")
                self.hours.config(text="00")
                self.mins.config(text="00")
                self.secs.config(text="00")
        self.after(1000, self.update_timer)
    # ========== 全屏效果:完全匹配你的截图 ==========
    def toggle_fullscreen(self, event=None):
        self.fullscreen = not self.fullscreen
        self.attributes("-fullscreen", self.fullscreen)
        if self.fullscreen:
            self.left_frame.pack_forget()
            self.right_frame.pack(fill="both", expand=True)
            self.config(bg="white")
            self.right_frame.config(bg="white")
            self.block_frame.config(bg="white")
            self.title_label.config(text="距离退休还剩:", fg="#4499ff", font=("微软雅黑", 26))
            self.title_label.place(relx=0.5, rely=0.15, anchor="center")
            self.tip.pack_forget()
            self.block_frame.place(relx=0.5, rely=0.5, anchor="center", relwidth=0.85, relheight=0.45)
            for w in [self.days, self.hours, self.mins, self.secs]:
                w.config(font=("微软雅黑", 90))
            for frame in self.block_frame.winfo_children():
                for lbl in frame.winfo_children():
                    if lbl["text"] in ["天", "时", "分", "秒"]:
                        lbl.config(font=("微软雅黑", 36))
        else:
            self.left_frame.pack(side="left", fill="both", expand=True, padx=5, pady=5)
            self.right_frame.pack(side="right", fill="both", expand=True, padx=5, pady=5)
            self.config(bg="#f5f7fa")
            self.right_frame.config(bg="white")
            self.block_frame.config(bg="white")
            self.title_label.config(text="退休倒计时", fg="black", font=("微软雅黑", 17, "bold"))
            self.title_label.pack(pady=22)
            self.tip.pack()
            self.tip.config(bg="white", fg="gray")
            for w in [self.days, self.hours, self.mins, self.secs]:
                w.config(font=("微软雅黑", 46, "bold"))
            for frame in self.block_frame.winfo_children():
                for lbl in frame.winfo_children():
                    if lbl["text"] in ["天", "时", "分", "秒"]:
                        lbl.config(font=("微软雅黑", 18))
    def exit_fullscreen(self, event=None):
        if self.fullscreen:
            self.toggle_fullscreen()
if __name__ == "__main__":
    app = RetirementUI()
    app.mainloop()

五、总结

本文实现的Python法定退休时间计算器,将官方复杂算法转化为可视化便捷工具,从需求分析、算法编写、界面开发到功能调试,完整覆盖Python GUI程序开发全流程。

程序不仅解决了大众退休时间查询的实际需求,也是Python Tkinter桌面程序开发的经典实战案例,适合新手学习界面开发、日期运算、事件绑定等核心知识点。运行代码即可直接使用,也可根据需求扩展功能(如数据保存、批量计算等)。

以上就是Python结合Tkinter实现法定退休时间计算器的详细内容,更多关于Python退休时间计算器的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文