用python实现身份证号校验系统

使用Tkinter作为GUI模块以及python基础,开发一款身份证号码校验的系统。

功能概览:

  1.  用户输入身份证号码     
  2. 从身份证号码得到该用户的地区信息、出生日期、以及身份证号码是否合法

Tkinter是Python标准库中的一个用于创建图形用户界面的模块。它提供了一组用于构建GUI的组件,例如窗口、按钮、菜单、文本框等。

下面是一个简单的例子,它创建了一个窗口,包含一个文本框和一个按钮。用户在文本框中输入身份证号码,点击按钮后,程序会解析并校验身份证号码的有效性。

校验身份证号码的校验码是否正确。

在中国大陆,身份证号码由17位数字组成,最后一位为校验码。校验码的计算方法如下:

  1. 将身份证号码的前17位数字依次与对应的系数相乘,系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

  2. 将乘积的各位数字相加,得到一个和值

  3. 将和值除以11,得到余数

  4. 如果余数为0,则校验码为1;如果余数为1,则校验码为0;其他情况下,校验码为11减去余数

下面是程序的完整代码,它实现了身份证号码的解析和校验功能:

import tkinter as tk
import tkinter.messagebox
from datetime import datetime

class Application(tk.Frame):

    def __init__(self, master=None):
        super().__init__(master)
        self.pack()
        self.create_widgets()

    def create_widgets(self):
        self.id_label = tk.Label(self, text="身份证号码:")
        self.id_label.pack()

        self.id_input = tk.Entry(self)
        self.id_input.pack()

        self.check_button = tk.Button(self, text="检验", command=self.check_id)
        self.check_button.pack()

    def check_id(self):
        id_str = self.id_input.get()
        # 提取前6位数字,用于解析出生地
        area_code = id_str[:6]
        # 提取第7到第14位数字,用于解析出生日期
        birth_date = id_str[6:14]

        # 解析出生日期
        # 将出生日期字符串转换为日期对象
        birth_date = datetime.strptime(birth_date, "%Y%m%d")

        # 通过校验码校验身份证号码的有效性
        check_code_map = "10X98765432"
        weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        # 将身份证号码的前17位数字与对应的系数相乘
        # 并将乘积的各位数字相加,得到一个和值
        sum_ = sum(int(a) * b for a, b in zip(id_str[:17], weight))
        # 将和值除以11,得到余数
        mod = sum_ % 11
        # 计算校验码
        check_code = check_code_map[mod]
        # 校验身份证号码的校验码是否正确
        valid = check_code == id_str[17]

        # 官方公布的地区代码表...
        area_table = {
            "110000": "北京市",
            "120000": "天津市",
            # ...
        }
        area = area_table.get(area_code, "未知地区")

        # 显示解析结果
        result = (
            f"出生地: {area}\n"
            f"出生日期: {birth_date:%Y-%m-%d}\n"
            f"身份证号码: {'合法' if valid else '无效'}\n"
        )
        tk.messagebox.showinfo("解析结果", result)

root = tk.Tk()
app = Application(master=root)
app.mainloop()

将出生日期字符串转换为日期对象,以便于更方便的显示和处理。

接着,我们通过校验码算法,计算出身份证号码的校验码,并与身份证号码的最后一位进行比较,如果一致,则表示身份证号码合法,否则为无效。

最后,我们通过tk.messagebox模块的showinfo方法,显示解析结果。

需要注意的是,上面给出的程序只是一个简单的例子,实际使用中,还需要处理更多的细节和异常情况,例如:

  • 身份证号码的长度不正确(应为18位)
  • 身份证号码中的前17位数字不是数字
  • 身份证号码中的校验码不是数字
  • 解析出生地时,无法找到对应的地区
  • 解析出生日期时,出生日期字符串格式不正确

为了避免程序出现这些异常情况,我们需要进行适当的处理,例如使用try/except语句进行异常捕获,或者对身份证号码的格式进行严格的正则表达式验证。

你可能感兴趣的:(python,开发语言)