qt设置一个网格_利用Python做一个中国公民身份证号验证查询系统

fc69e673af98de3ca55bdb777d91a2ab.png

今天和大家分享的是利用Python做一个中国公民身份证号验证查询系统。

本系统可以实现身份证号真伪验证,年龄、性别及发证地查询,涉及知识主要有python字符串处理、表格读写和GUI制作。

首先我们先来了解一下身份证的构成。

516afd8d8cdf03c52dc34e3669f6b042.png

18位身份证号码各位的含义:1-2位省、自治区、直辖市代码;3-4位地级市、盟、自治州代码;5-6位县、县级市、区代码;7-14位出生年月日,比如19820426代表1982年4月26日;15-17位为顺序号,其中17位(倒数第二位)男为单数,女为双数;18位为校验码,0-9和X。作为尾号的校验码,是由把前十七位数字带入统一的公式计算出来的,计算的结果是0-10,如果某人的尾号是0-9,都不会出现X,但如果尾号是10,那么就得用X来代替,因为如果用10做尾号,那么此人的身份证就变成了19位。X是罗马数字的10,用X来代替10。举例:330226 19820426 0012这个身份证号的含义: 33为浙江,02为宁波,26为宁海县,出生日期为1982年4月26日,顺序号为001,2为校验码。
第二步:归类整理地址码与区县对应关系

可以百度整理成Excel,实在找不到可以公众号找我要整理好的。

74996533a52e7bb4e4bc8142f0ed8adc.png

第三步:验证身份证号真伪

身份证最后一位校验码算法如下:

①将身份证号码前17位数分别乘以不同的系数,从第1位到第17位的系数分别为:7 9 10 5 8 4 2 1 6 3 7 9 10 5 8 4 2

②将得到的17个乘积相加。

③将相加后的和除以11并得到余数。

④余数可能为0 1 2 3 4 5 6 7 8 9 10这些个数字,其对应的身份证最后一位校验码为1 0 X 9 8 7 6 5 4 3 2。

验证实现代码:

6976f9eb045272fbdb56ea0991a4bf0f.png

第四步:查询地区

读取Excel整理的地区码匹配。
实现代码:

908886dd2eb3b4dc5f4f274ab974bac8.png

第五步:查询性别和年龄

判断男女:对身份证16位对2求余判断奇偶,然后匹配,0为女,1为男。

判断年龄,获取系统时间的年减去输入身份证的7-10位。

实现代码:

b386c22c36fd05741c7a5d2a51789a56.png

最后:GUI界面设计

利用网格方式设置好界面的大小、标题,文本,文本框和按钮,并绑定。

查询按钮与check函数(信号)绑定。

df527cf723c4f3270670d6ed123df60b.png

把结果绑定回文本框

e73a3b6b8da06e40290fe87ee21c5a26.png

项目到此结束,快点动手起来吧。

完整项目代码如下:

import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
import random
import requests
from bs4 import BeautifulSoup
import threading
import pandas as pd
import datetime
data = pd.read_excel('全国身份证号对应省市区.xls', header=None, names=['身份证前六位', '所属地区'])
gender_id = {'0': '女', '1': '男'}
class Window(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.setWindowTitle("中国公民身份证号验证查询系统")
        self.layout = QGridLayout()
        self.setLayout(self.layout)  # 局部布局

        self.titleText = QTextBrowser()
        self.titleText.setText('中国公民身份证号验证查询系统')
        self.titleText.setStyleSheet(
            "font-size:24px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#0000CD")
        self.titleText.setAlignment(Qt.AlignCenter)
        self.titleText.setFixedSize(500, 40)
        self.layout.addWidget(self.titleText, 0, 0, 1, 3 , Qt.AlignCenter)
        self.Text = QTextBrowser()
        self.Text.setText('需查询身份证号码:')
        self.Text.setAlignment(Qt.AlignRight)
        self.Text.setStyleSheet(
            "vertical-align:middle;font-size:18px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#FFA500")
        self.Text.setFixedSize(180, 30)
        self.layout.addWidget(self.Text, 1, 0, Qt.AlignRight)

        self.idcardText = QLineEdit(self)
        self.idcardText.setFixedSize(210, 30)
        self.idcardText.setStyleSheet("font-size:16px;font-weight:500;background-color: rgba(255,255,255,180);border: none;color:#55007f")
        self.layout.addWidget(self.idcardText, 1, 1, Qt.AlignLeft)

        self.Text = QTextBrowser()
        self.Text.setText('查询结果:')
        self.Text.setAlignment(Qt.AlignRight)
        self.Text.setStyleSheet(
            "font-size:18px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#FFA500")
        self.Text.setFixedSize(105, 30)
        self.layout.addWidget(self.Text, 2, 0, Qt.AlignRight)

        self.resultText = QLineEdit(self)
        self.resultText.setFixedSize(210, 25)
        self.resultText.setStyleSheet(
            "font-size:16px;font-weight:500;background-color: rgba(255,255,255,180);border: none;color:#55007f")
        self.layout.addWidget(self.resultText, 2, 1, Qt.AlignLeft)

        self.Text = QTextBrowser()
        self.Text.setText('性别:')
        self.Text.setAlignment(Qt.AlignRight)
        self.Text.setStyleSheet(
            "font-size:18px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#FFA500")
        self.Text.setFixedSize(65, 30)
        self.layout.addWidget(self.Text, 3, 0, Qt.AlignRight)

        self.genderText = QLineEdit(self)
        self.genderText.setFixedSize(210, 25)
        self.genderText.setStyleSheet(
            "font-size:16px;font-weight:500;background-color: rgba(255,255,255,180);border: none;color:#55007f")
        self.layout.addWidget(self.genderText, 3, 1, Qt.AlignLeft)

        self.Text = QTextBrowser()
        self.Text.setText('年龄:')
        self.Text.setAlignment(Qt.AlignRight)
        self.Text.setStyleSheet(
            "font-size:18px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#FFA500")
        self.Text.setFixedSize(65, 30)
        self.layout.addWidget(self.Text, 4, 0, Qt.AlignRight)

        self.ageText = QLineEdit(self)
        self.ageText.setFixedSize(210, 25)
        self.ageText.setStyleSheet(
            "font-size:16px;font-weight:500;background-color: rgba(255,255,255,180);border: none;color:#55007f")
        self.layout.addWidget(self.ageText, 4, 1, Qt.AlignLeft)

        self.Text = QTextBrowser()
        self.Text.setText('发证地:')
        self.Text.setAlignment(Qt.AlignRight)
        self.Text.setStyleSheet(
            "font-size:18px;font-weight:700;background:white;background-color: rgba(255,255,255,255);border: none;color:#FFA500")
        self.Text.setFixedSize(85, 30)
        self.layout.addWidget(self.Text, 5, 0, Qt.AlignRight)

        self.addressText = QLineEdit(self)
        self.addressText.setFixedSize(210, 25)
        self.addressText.setStyleSheet(
            "font-size:16px;font-weight:500;background-color: rgba(255,255,255,180);border: none;color:#55007f")
        self.layout.addWidget(self.addressText, 5, 1, Qt.AlignLeft)

        self.startPushButton = QPushButton("开始查询")
        self.startPushButton.setFixedSize(70, 60)
        self.startPushButton.clicked.connect(self.check)
        self.layout.addWidget(self.startPushButton, 3, 2, 2, 2, Qt.AlignRight)

    def check(self):
        idcard = self.idcardText.text()
        verification = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
        sum = 0
        for i, j in zip(list(idcard)[0:18], verification):
            sum += int(i) * j
        final_dic = {0: 1, 1: 0, 2: 'X', 3: 9, 4: 8, 5: 7, 6: 6, 7: 5, 8: 4, 9: 3, 10: 2}
        if str(final_dic[sum % 11]) == str(idcard[17]):
            self.resultText.setText('验证成功,身份证有效')
        else:
            self.resultText.setText('验证失败,身份证无效')
        gender_id = {'0': '女', '1': '男'}
        gender = gender_id[str(int(idcard[16]) % 2)]
        age = int(datetime.datetime.now().year) - int(idcard[6:10])
        address = data[data['身份证前六位'].eq(idcard[:6])]['所属地区']

        self.genderText.setText(gender)
        self.ageText.setText(str(age))
        self.addressText.setText(str(address.values[0]))
    def closeEvent(self, event):
        reply = QMessageBox.question(self, 'Message',
                                     "是否确认退出?", QMessageBox.Yes |
                                     QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:
            event.accept()else:
            event.ignore()
app = QApplication(sys.argv)
show = Window()  #主窗口的类
palette = QPalette()
palette.setBrush(QPalette.Background, QBrush(QPixmap("bg.jpg")))
show.setFixedSize(500, 250)
show.setPalette(palette)
show.show()
sys.exit(app.exec_())

测试截图:

7c1e7ae6cad071d250a4f489a86fa988.png

9e9c78340ab2b0e42fd867698e66bedf.png

欢迎扫码关注我的个人公众号:

f003d7b9d635f59fe419c703957479ca.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值