身份证校验工具

python构建的身份证校验码验证程序的极简界面实现,使用Tkinter构建图形用户界面:

身份证校验工具

​​关身份证校验码验证键特性说明:​

  1. ​用户友好界面​​:使用Tkinter构建了直观的图形界面,包含输入框、按钮和结果显示区域

  2. ​实时验证​​:支持回车键快速验证,提供清晰的视觉反馈

  3. ​完整验证逻辑​​:实现了标准的身份证校验码验证算法,包括长度检查、数字格式检查和校验码计算

  4. ​错误处理​​:对各类输入错误提供友好的提示信息

  5. ​响应式设计​​:界面布局合理,支持滚动查看长文本结果

运行此程序将打开一个图形窗口,您可以输入身份证号码进行实时验证。程序会自动检查号码格式并显示详细的验证结果。

复制代码
import tkinter as tk
from tkinter import messagebox, ttk


class IDValidatorGUI:
    def __init__(self, root):
        self.root = root
        self.root.title("身份证校验工具")
        self.root.geometry("400x300")
        self.root.resizable(False, False)

        # 设置样式
        self.setup_styles()

        # 创建界面组件
        self.create_widgets()

    def setup_styles(self):
        """设置界面样式"""
        style = ttk.Style()
        style.configure("TLabel", font=("微软雅黑", 10))
        style.configure("TButton", font=("微软雅黑", 10))
        style.configure("TEntry", font=("微软雅黑", 10))

    def create_widgets(self):
        """创建界面组件"""
        # 主标题
        title_label = ttk.Label(self.root, text="身份证号码校验", font=("微软雅黑", 16, "bold"))
        title_label.pack(pady=20)

        # 输入框和标签
        input_frame = ttk.Frame(self.root)
        input_frame.pack(pady=10, padx=20, fill="x")

        ttk.Label(input_frame, text="请输入身份证号码:").pack(anchor="w")

        self.id_entry = ttk.Entry(input_frame, font=("Consolas", 12), width=30)
        self.id_entry.pack(pady=5, fill="x")
        self.id_entry.bind("<Return>", lambda event: self.validate_id())  # 回车键绑定

        # 按钮框架
        button_frame = ttk.Frame(self.root)
        button_frame.pack(pady=15)

        ttk.Button(button_frame, text="校验", command=self.validate_id).pack(side="left", padx=5)
        ttk.Button(button_frame, text="清空", command=self.clear_input).pack(side="left", padx=5)
        ttk.Button(button_frame, text="退出", command=self.root.quit).pack(side="left", padx=5)

        # 结果显示区域
        result_frame = ttk.LabelFrame(self.root, text="校验结果", padding=10)
        result_frame.pack(pady=10, padx=20, fill="both", expand=True)

        self.result_text = tk.Text(result_frame, height=8, font=("微软雅黑", 9),
                                   wrap="word", state="disabled", bg="#f0f0f0")
        scrollbar = ttk.Scrollbar(result_frame, orient="vertical", command=self.result_text.yview)
        self.result_text.configure(yscrollcommand=scrollbar.set)

        self.result_text.pack(side="left", fill="both", expand=True)
        scrollbar.pack(side="right", fill="y")

    def validate_id(self):
        """验证身份证号码"""
        id_number = self.id_entry.get().strip()

        if not id_number:
            messagebox.showwarning("输入错误", "请输入身份证号码")
            return

        # 清空之前的结果
        self.result_text.config(state="normal")
        self.result_text.delete(1.0, tk.END)

        # 执行验证
        is_valid, message = self.check_id_number(id_number)

        # 显示结果
        if is_valid:
            self.result_text.insert(tk.END, f"✅ 验证通过!\n\n", "success")
            self.result_text.insert(tk.END, f"身份证号码: {id_number}\n")
            self.result_text.insert(tk.END, "校验结果: 格式正确,校验码验证通过\n")
        else:
            self.result_text.insert(tk.END, f"❌ 验证失败!\n\n", "error")
            self.result_text.insert(tk.END, f"身份证号码: {id_number}\n")
            self.result_text.insert(tk.END, f"错误信息: {message}\n")

        # 设置文本样式标签
        self.result_text.tag_configure("success", foreground="green", font=("微软雅黑", 10, "bold"))
        self.result_text.tag_configure("error", foreground="red", font=("微软雅黑", 10, "bold"))

        self.result_text.config(state="disabled")

    def clear_input(self):
        """清空输入和结果"""
        self.id_entry.delete(0, tk.END)
        self.result_text.config(state="normal")
        self.result_text.delete(1.0, tk.END)
        self.result_text.config(state="disabled")
        self.id_entry.focus()

    def check_id_number(self, id_number):
        """验证身份证号码的核心算法"""
        # 权重系数
        weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        # 校验码映射表
        check_codes = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2']

        # 1. 检查长度
        if len(id_number) != 18:
            return False, "身份证号码长度必须为18位"

        # 2. 检查前17位是否为数字
        if not id_number[:17].isdigit():
            return False, "前17位必须全部为数字"

        # 3. 计算加权和
        total = 0
        for i in range(17):
            total += int(id_number[i]) * weights[i]

        # 4. 计算校验码
        z = total % 11
        expected_check_code = check_codes[z]

        # 5. 比较校验码(允许小写x)
        actual_check_code = id_number[17].upper()

        if actual_check_code == expected_check_code:
            return True, "验证通过"
        else:
            return False, f"校验码错误,应为'{expected_check_code}',实际为'{actual_check_code}'"


def main():
    """主函数"""
    root = tk.Tk()
    app = IDValidatorGUI(root)
    root.mainloop()


if __name__ == "__main__":
    main()
相关推荐
前端九哥3 小时前
我删光了项目里的 try-catch,老板:6
前端·vue.js
2301_800256113 小时前
地理空间数据库作业笔记——酒驾交通事故分析
sql·postgresql·1024程序员节
苏小瀚3 小时前
[MySQL] JDBC
1024程序员节
4Forsee3 小时前
【Android】View 事件分发机制与源码解析
android·java·前端
Pluchon3 小时前
硅基计划5.0 MySQL 陆 视图&JDBC编程&用户权限控制
数据库·mysql·1024程序员节
VT.馒头3 小时前
【力扣】2725. 间隔取消
javascript·leetcode·1024程序员节
小宁爱Python3 小时前
从入门到实践:LangGraph 构建复杂 AI 工作流的完整指南
人工智能·python·microsoft·django
一 乐3 小时前
车辆管理|校园车辆信息|基于SprinBoot+vue的校园车辆管理系统(源码+数据库+文档)
java·前端·数据库·vue.js·论文·毕设·车辆管理
vistaup3 小时前
Android 基于清单文件mate-data数据共享
1024程序员节