身份证校验工具

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()
相关推荐
初恋叫萱萱11 小时前
技术基石与职场进阶:构建从Web后端到高性能架构的完整知识图谱
前端·架构·知识图谱
萧鼎11 小时前
深入解析 Python 的 Word 模板引擎:docxtpl 全面指南
开发语言·python·word
木木木一11 小时前
Rust学习记录--C9 错误处理
前端·学习·rust
局外人LZ12 小时前
libsodium.js:web端与 Node.js 的现代加密工具集,构建前端安全加密体系
前端·javascript·node.js
Yeats_Liao12 小时前
昇腾910B与DeepSeek:国产算力与开源模型的架构适配分析
人工智能·python·深度学习·神经网络·机器学习·架构·开源
xkxnq12 小时前
第二阶段:Vue 组件化开发(第 20天)
前端·javascript·vue.js
智航GIS12 小时前
11.3 Pandas 模块功能概览
python·信息可视化·pandas
浩子智控12 小时前
开源RPA选择
python·c#·软件工程
「、皓子~12 小时前
AI 创作系列(34)海狸IM桌面版 v1.1 正式发布:Vite + Electron 性能优化与体验升级
前端·人工智能·electron·开源·开源软件·im
鹏程十八少12 小时前
1.Android 3分钟跑通腾讯 Shadow 插件化官方Demo:零反射、手把手实战(基于源码依赖)
android·前端·面试