身份证校验工具

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()
相关推荐
万少2 小时前
HarmonyOS 开发必会 5 种 Builder 详解
前端·harmonyos
橙序员小站4 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
炫饭第一名7 小时前
速通Canvas指北🦮——基础入门篇
前端·javascript·程序员
王晓枫7 小时前
flutter接入三方库运行报错:Error running pod install
前端·flutter
符方昊7 小时前
React 19 对比 React 16 新特性解析
前端·react.js
ssshooter7 小时前
又被 Safari 差异坑了:textContent 拿到的值居然没换行?
前端
曲折7 小时前
Cesium-气象要素PNG色斑图叠加
前端·cesium
Forever7_7 小时前
Electron 淘汰!新的桌面端框架 更强大、更轻量化
前端·vue.js
Angelial7 小时前
Vue3 嵌套路由 KeepAlive:动态缓存与反向配置方案
前端·vue.js
jiayu8 小时前
Angular学习笔记24:Angular 响应式表单 FormArray 与 FormGroup 相互嵌套
前端