身份证校验工具

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()
相关推荐
码云骑士4 分钟前
02-Python可变对象与不可变对象(上)-赋值陷阱与函数传参的暗坑
开发语言·python
疯狂学习GIS6 分钟前
基于Python earthaccess库批量下载全球MODIS GPP(MOD17A2HGF)数据
python·脚本·批量下载·遥感影像·nasa·earthdata·自动处理
至乐活着6 分钟前
用DeepSeek打造你自己的智能问答系统:从零到一的完整指南
python·deepseek·ai应用开发·智能问答系统·api教程
AI创界者10 分钟前
【解压即用】Scail-2 视频动作迁移一键整合包:8G显存通吃50系,长视频/多人/精准目标替换全攻略
人工智能·python·aigc·音视频
布朗克16812 分钟前
39 Spring Boot Web实战
前端·spring boot·后端·实战
纽格立科技22 分钟前
DRM 发射端链路图(上)
前端·人工智能·车载系统·信息与通信·传媒
花月C30 分钟前
AI驱动的竞品分析多Agent协作系统设计理论
人工智能·python·ai·agent·ai编程
云水一下35 分钟前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq43569470137 分钟前
Vue05
前端·vue.js
qq_4221525739 分钟前
PDF 解密工具怎么选?2026 年文档密码移除方案与注意事项
java·前端·pdf