公民身份号码是每个公民唯一的、终身不变的身份代码,由公安机关按照公民身份号码国家标准编制。每一个居民只能拥有一个唯一的身份证,它是用于证明持有人身份的一种法定证件。
身份证包含了个人的一些重要信息,比如:
除了这些基本的数字信息,身份证上还可能包含其他相关信息,如民族、性别等。这些信息可以通过相应的规则和算法进行解读和验证。
- # -*- coding: utf-8 -*-
- import tkinter as tk
- import tkinter.messagebox
- import pickle
- import random
-
- # 窗口
- window = tk.Tk()
- window.title('欢迎进入python')
- window.geometry('450x200')
- # 画布放置图片
- # canvas=tk.Canvas(window,height=300,width=500)
- # imagefile=tk.PhotoImage(file='qm.png')
- # image=canvas.create_image(0,0,anchor='nw',image=imagefile)
- # canvas.pack(side='top')
- # 标签 用户名密码
- Verification_Code = random.randint(1000, 9999)#设置一个随机的四位数
- Verification_Code = str(Verification_Code)#把类型转换为str型
- print(type(Verification_Code))
- tk.Label(window, text='用户名:').place(x=100, y=30)
- tk.Label(window, text='密码:').place(x=100, y=70)
- tk.Label(window, text='验证码').place(x=100, y=110)
- tk.Label(window, text=Verification_Code).place(x=320, y=110)
- # 用户名输入框
- var_usr_name = tk.StringVar()
- entry_usr_name = tk.Entry(window, textvariable=var_usr_name)
- entry_usr_name.place(x=160, y=30)
- # 密码输入框
- var_usr_pwd = tk.StringVar()
- entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, show='*')
- entry_usr_pwd.place(x=160, y=70)
- #验证码输入框
- var_usr_yzm = tk.StringVar()
- entry_usr_yzm = tk.Entry(window, textvariable=var_usr_yzm)
- entry_usr_yzm.place(x=160, y=110)
-
-
- # 登录函数
- def usr_log_in():
- # 输入框获取用户名密码
- usr_name = var_usr_name.get()
- usr_pwd = var_usr_pwd.get()
- usr_yzm = var_usr_yzm.get()
- #测试类型
- print(type(usr_yzm),type(Verification_Code))
- # 从本地字典获取用户信息,如果没有则新建本地数据库
- try:
- with open('usr_info.pickle', 'rb') as usr_file:
- usrs_info = pickle.load(usr_file)
- except FileNotFoundError:
- with open('usr_info.pickle', 'wb') as usr_file:
- usrs_info = {'admin': 'admin'}
- pickle.dump(usrs_info, usr_file)
- # 判断验证码是否正确用户名和密码是否匹配
- if usr_yzm == Verification_Code:
- if usr_name in usrs_info:
- if usr_pwd == usrs_info[usr_name]:
- tk.messagebox.showinfo(title='welcome',
- message='欢迎您:' + usr_name)
- else:
- tk.messagebox.showerror(message='密码错误')
- # 用户名密码不能为空
- elif usr_name == '' or usr_pwd == '':
- tk.messagebox.showerror(message='用户名或密码为空')
- # 不在数据库中弹出是否注册的框
- else:
- is_signup = tk.messagebox.askyesno('欢迎', '您还没有注册,是否现在注册')
- if is_signup:
- usr_sign_up()
- elif usr_yzm == '':
- tk.messagebox.showerror(message='验证码不能为空')
- else:
- tk.messagebox.showerror(message='验证码有误!')
-
-
- # 注册函数
- def usr_sign_up():
- # 确认注册时的相应函数
- def signtowcg():
- # 获取输入框内的内容
- nn = new_name.get()
- np = new_pwd.get()
- npf = new_pwd_confirm.get()
-
- # 本地加载已有用户信息,如果没有则已有用户信息为空
- try:
- with open('usr_info.pickle', 'rb') as usr_file:
- exist_usr_info = pickle.load(usr_file)
- except FileNotFoundError:
- exist_usr_info = {}
-
- # 检查用户名存在、密码为空、密码前后不一致
- if nn in exist_usr_info:
- tk.messagebox.showerror('错误', '用户名已存在')
- elif np == '' or nn == '':
- tk.messagebox.showerror('错误', '用户名或密码为空')
- elif np != npf:
- tk.messagebox.showerror('错误', '密码前后不一致')
- # 注册信息没有问题则将用户名密码写入数据库
- else:
- exist_usr_info[nn] = np
- with open('usr_info.pickle', 'wb') as usr_file:
- pickle.dump(exist_usr_info, usr_file)
- tk.messagebox.showinfo('欢迎', '注册成功')
- # 注册成功关闭注册框
- window_sign_up.destroy()
-
- # 新建注册界面
- window_sign_up = tk.Toplevel(window)
- window_sign_up.geometry('350x200')
- window_sign_up.title('注册')
- # 用户名变量及标签、输入框
- new_name = tk.StringVar()
- tk.Label(window_sign_up, text='用户名:').place(x=10, y=10)
- tk.Entry(window_sign_up, textvariable=new_name).place(x=150, y=10)
- # 密码变量及标签、输入框
- new_pwd = tk.StringVar()
- tk.Label(window_sign_up, text='请输入密码:').place(x=10, y=50)
- tk.Entry(window_sign_up, textvariable=new_pwd, show='*').place(x=150, y=50)
- # 重复密码变量及标签、输入框
- new_pwd_confirm = tk.StringVar()
- tk.Label(window_sign_up, text='请再次输入密码:').place(x=10, y=90)
- tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*').place(x=150, y=90)
- # 确认注册按钮及位置
- bt_confirm_sign_up = tk.Button(window_sign_up, text='确认注册',
- command=signtowcg)
- bt_confirm_sign_up.place(x=150, y=130)
-
-
- # 退出的函数
- def usr_sign_quit():
- window.destroy()
-
-
- # 登录 注册按钮
- bt_login = tk.Button(window, text='登录', command=usr_log_in)
- bt_login.place(x=140, y=150)
- bt_logup = tk.Button(window, text='注册', command=usr_sign_up)
- bt_logup.place(x=210, y=150)
- bt_logquit = tk.Button(window, text='退出', command=usr_sign_quit)
- bt_logquit.place(x=280, y=150)
- # 主循环
- window.mainloop()
-
- import tkinter as tk # 使用Tkinter前需要先导入
- import re
-
- # 第1步,实例化object,建立窗口window
- window = tk.Tk()
-
- # 第2步,给窗口的可视化起名字
- window.title('身份证号码查询')
-
- # 第3步,设定窗口的大小(长 * 宽)
- window.geometry('700x500')
-
- # 第4步,在图形界面上设定标签
- l = tk.Label(window, text='身份证号验证', font=('宋体', 30), width=40, height=2)
- l1 = tk.Label(window, text='身份证号:', font=('Arial', 16), width=40, height=2)
-
- # 第5步,放置标签
- l.place(x=-80, y=0, anchor='nw')
- l1.place(x=-100, y=80, anchor='nw')
-
- # 第4步,在图形界面上设定输入框控件entry框并放置
- e = tk.Entry(window, show=None, font=('Arial', 20),)
- e.place(x=200, y=90, anchor='nw')
-
-
- # 第5步,定义两个触发事件时的函数check和delete
- def check(): # 按钮'检查'对应的函数
- t.delete(1.0, 'end')
- IDcard = e.get()
- if len(IDcard) != 18:
- var = '号码:' + IDcard + "\n身份证号码位数不对!\n错误的身份证号码.\n请重新输入!\n"
- else:
- IDcard_add = IDcard[0:6] # 身份证前6位,对应归属地
- IDcard_birth = IDcard[6:14] # 身份证中间8位,对应出生日期
- IDcard_sex = IDcard[14:17] # 身份证15,,16,17位,对应性别
-
- area = {"11": "北京", "12": "天津", "13": "河北", "14": "山西", "15": "内蒙古", "21": "辽宁",
- "22": "吉林", "23": "黑龙江", "31": "上海", "32": "江苏", "33": "浙江", "34": "安徽",
- "35": "福建", "36": "江西", "37": "山东", "41": "河南", "42": "湖北","43": "湖南",
- "44": "广东", "45": "广西", "46": "海南", "50": "重庆", "51": "四川", "52": "贵州",
- "53": "云南", "54": "西藏", "61": "陕西", "62": "甘肃", "63": "青海", "64": "宁夏",
- "65": "新疆", "71": "台湾", "81": "香港", "82": "澳门", "91": "国外"}
-
- # 地区校验
- if IDcard[0:2] not in area.keys():
- var = '号码:' + IDcard + '\n身份证地区非法!\n错误的身份证号码\n'
- else:
- year = IDcard_birth[0:4] # 出生年份
- month = IDcard_birth[4:6] # 出生月份
- day = IDcard_birth[6:8] # 出生日
-
- # 出生日期的合法性检查
- # 闰年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
- # |[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))
- # 平年月日:((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]
- # |[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))
- if (int(year) % 4 == 0 or (int(year) % 100 == 0 and int(year) % 4 == 0)):
- ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
- '|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))'
- '[0-9]{3}[0-9Xx]$') # //闰年出生日期的合法性正则表达式
- else:
- ereg = re.compile('[1-9][0-9]{5}((19[0-9]{2})|(20[0-1][0-8]))((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]'
- '|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8])'
- ')[0-9]{3}[0-9Xx]$') # //平年出生日期的合法性正则表达式
- # //测试出生日期的合法性
- if (re.match(ereg, IDcard)):
- IDcard_check = IDcard[17] # 身份证最后一位
- W = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2] # 逐位权数
- IDcard_CHECK = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'] # 身份证检验位
- IDcard_sum = 0 # 定义累加和
- for i in range(0, 17):
- IDcard_sum = IDcard_sum + int(IDcard[i]) * W[i] # 逐位加权求和
- IDcard_Check = IDcard_sum % 11 # 取余数
- if IDcard_check != IDcard_CHECK[IDcard_Check]: # 和检验位对比
- var = '号码:' + IDcard + '\n身份证号码校验错误!\n错误的身份证号码\n'
- else:
- if int(IDcard_sex) % 2 == 0:
- var = "正确的身份证号码! \n" + '号码:' + IDcard + '\n地区:' + area[IDcard[0: 2]] + \
- '\n生日:' + year + '年' + month + '月' + day + '日' + "\n 性别:女\n"
- else:
-
- var = "正确的身份证号码! \n" + '号码:' + IDcard + '\n地区:' + area[IDcard[0: 2]] + \
- "\n生日: " + year + '年' + month + '月' + day + '日' + "\n性别:男 \n"
- else:
- var = '号码:' + IDcard + '\n身份证号码出生日期超出范围或含有非法字符!\n错误的身份证号码\n'
- t.insert('insert', var) # 显示输出
- e.delete(0, 'end')
-
- # 第6步,创建并放置两个按钮分别触发两种情况
- b1 = tk.Button(window, text='检查', width=10, height=2, command = check)
- b1.place(x=550, y=80, anchor='nw')
-
- # 第7步,创建并放置一个多行文本框text用以显示
- t = tk.Text(window, font=('宋体', 20), width=38, height=8)
- t.place(x=100, y=210, anchor='nw')
-
- # 第8步,主窗口循环显示
- window.mainloop()

