开发者

Python+PyQt开发证件号智能校验工具

目录
  • 一、引言
  • 二、GUI界面设计
    • 1.相关提示
    • 2.效果演示
    • 3.界面设计.py
  • 三、主要程序详解
    • 1.导入相关模块
    • 2.初始化设置
    • 3.校验过程
  • 四、总程序代码

    一、引言

    在数字化转型加速的背景下,证件信息核验已成为金融、政务、安防等领域的刚需。传统人工校验存在效率低、易出错等问题,而基于PyQt框架与python语言开发的证件号智能校验工具,通过图形化界面与自动化算法,实现了高效、精准的证件信息验证,显著降低人工核验成本,提升数据合规性。开发灵感来源于企业实名认证、政务服务窗口、物联网设备身份绑定等场景。

    二、GUI界面设计

    使用PyQt5进行界面的搭建,界面如下: 

    Python+PyQt开发证件号智能校验工具

    初始界面搭建采用极简风格。当输入合法的身份证号码后,点击“开始校验”,则会出现对应提示(是合法的);否则,不仅会告知用户此身份证号码不合法,同时还会根据输入身份证号码的前17位自动计算第18位的校验码,最后将正确的校验码结果告知给用户。

    1.相关提示

    Python+PyQt开发证件号智能校验工具

    若输入非法,即出现汉字符、或位数不等于18等常见特殊情况,直接点击“开始校验”后,会弹出对应相关提示。

    2.效果演示

    Python+PyQt开发证件号智能校验工具

    3.界面设计.py

    通过pyuic5产生的GUI界面代码UI_IdentificationCard.py如下:

    # -*- coding: utf-8 -*-
    
    # Form implementation generated from reading ui file 'UI_IdentificationCard.ui'
    #
    # Created by: PyQt5 UI code generator 5.15.11
    #
    # WARNING: Any manual changes made to this file will be lost when pyuic5 is
    # run again.  Do not edit this file unless you know what you are doing.
    
    
    from PyQt5 import QtCore, QtGui, QtWidgets
    
    
    class Ui_Form(object):
        def setupUi(self, Form):
            Form.setObjectName("Form")
            Form.setEnabled(True)
            Form.resize(300, 390)
            Form.setMinimumSize(QtCore.QSize(300, 390))
            Form.setMaximumSize(QtCore.QSize(300, 390))
            icon = QtGui.QIcon()
            icon.addPixmap(QtGui.QPixmap(":/image1.png"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
            Form.setWindowIcon(icon)
            self.label_5 = QtWidgets.QLabel(Form)
            self.label_5.setGeometry(QtCore.QRect(150, 50, 141, 31))
            font = QtGui.QFont()
            font.setFamily("Adobe Arabic")
            font.setPointSize(16)
            self.label_5.setFont(font)
            self.label_5.setObjectName("label_5")
            self.label_8 = QtWidgets.QLabel(Form)
            self.label_8.setGeometry(QtCore.QRect(70, 20, 181, 31))
            font = QtGui.QFont()
            font.setFamily("Adobe Arabic")
            font.setPointSize(16)
            font.setBold(False)
            font.setWeight(50)
            self.label_8.setFont(font)
            self.label_8.setObjectName("label_8")
            self.label_10 = QtWidgets.QLabel(Form)
            self.label_10.setGeometry(QtCore.QRect(230, 40, 71, 51))
            self.label_10.setText("")
            self.label_10.setPixmap(QtGui.QPixmap(":/image1.png"))
            self.label_10.setObjectName("label_10")
            self.lineEdit = QtWidgets.QLineEdit(Form)
            self.lineEdit.setGeometry(QtCore.QRect(30, 150, 241, 20))
            self.lineEdit.setObjectName("lineEdit")
            self.label = QtWidgets.QLabel(Form)
            self.label.setGeometry(QtCore.QRect(30, 130, 161, 16))
            self.labe编程l.setObjectName("label")
            self.pushButton = QtWidgets.QPushButton(Form)
            self.pushButton.setGeometry(QtCore.QRect(30, 190, 241, 23))
            self.pushButton.setObjectName("pushButton")
            self.label_2 = QtWidgets.QLabel(Form)
            self.label_2.setGeometry(QtCore.QRect(30, 230, 171, 16))
            self.label_2.setObjectName("label_2")
            self.label_3 = QtWidgets.QLabel(Form)
            self.label_3.setGeometry(QtCore.QRect(30, 250, 241, 111))
            self.label_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
            self.label_3.setText("")
            self.label_3.setAlignment(QtCore.Qt.AlignCenter)
            sephplf.label_3.setObjectName("label_3")
    
            self.retranslateUi(Form)
            QtCore.QMetaObject.connectSlotsByName(Form)
    
        def retranslateUi(self, Form):
            _translate = QtCore.QCoreApplication.translate
            Form.setWindowTitle(_translate("Form", "Identification_card"))
            self.label_5.setText(_translate("Form", "Designed By"))
            self.label_8.setText(_translate("Form", "身份证校验工具"))
            self.label.setText(_translate("Form", "请输入您的身份证号码:"))
            self.pushButton.setText(_translate("Form", "开始校验"))
            self.label_2.setText(_translate("Form", "校验结果如下:"))
    import ziyuan_rc
    

    三、主要程序详解

    1.导入相关模块

    import sys
    from UI_IdentificationCard import *
    from PyQt5.QtWidgets import QApplication, QWidget
    
    # 保持窗口大小和qtdesigner中的一致
    from PyQt5 import QtCore
    QtCore.QCoreApplication.setAttribute(QtCorephp.Qt.AA_EnableHighDpiScaling)

    导入前端页面设计文件:UI_IdentificationCard.py;不懂为啥需要导入Qtcore的,请看一键曝光:Python+PyQt实现的文件目录。

    2.初始化设置

        def __init__(self):
            super(QWidget, self).__init__()
            self.setupUi(self)
    
            self.label_2.setVisible(False)
            self.label_3.setVisible(False)
    
            self.pushButton.clicked.connect(self.jiaoyan)

    为控制告知用户校验结果的显示与否,在初始化的时候,需要先将可视状态visible设置为False,再检测pushbutton是否被按下,并将其链接到jiaoyan函数。

    3.校验过程

        def jiaoyan(self):
            he = 0
            jiaquan_lst = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
            jiaoyan_lst = ['1','0','X','9','8','7','6','5','4','3','2']
    
            i_card = self.lineEdit.text()
            if i_card[0:16].isdigit():
                if len(i_card) == 18:
                    for i in range(len(i_card)-1):
                        he = he + jiaquan_lst[i]*int(i_card[i])
                    yu = he%11
                    jiaoyanma = jiaoyan_lst[yu]
    
                    self.label_2.setVisible(True)
                    self.label_3.setVisible(True)
    
                    if str(jiaoyanma) == i_card[-1]:
                        self.label_3.setText("该身份证号码合法!")
                    else:
                        self.label_3.setText("该身份证号码非法!\n最后一位校验码应为:"+str(jiaoyanma))
                else:
                    QtWidgets.QMessageBox.critical(self, "提示", "请检查身份证号码位数!")
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "请输入身份证号码!")

    加权和用he表示;jiaquan_lst表示加权因子表,不同位置序号对应不同的加权因子;加权因子表和校验码表如下所示:

    Python+PyQt开发证件号智能校验工具

    首先获取用户输入框edittext的内容并将其存储在i_card变量中,接着通过切片获取i_card的前17位截取前17位的原因是:存在最后一位为X的特殊情况),并判断其是否由纯数字组成;如果长度再符合要求(即等于18),则可以通过循环将前17位进行加权和;最后将加权和对11取余得到yu,同时在校验码表中找到对应的校验码;通过比较用户输入身份证号的最后一位与真实计算得到的校验码,判断该身份证号是否合法及给出相应的提示。

    补充校验码计算方法:

    将前 17 位号码与相应的加权因子相乘并求和。将所得总和除以 11 取余,根据余数匹配校验码对照表,得到最终的校验码。 

    校验码计算示例: 

    假设身份证号码前 17 位为 11223344556677890(示例数据,非实际号码)。

    1.逐位相乘加权因子并求和: 1×7+1×9+2×10+2×5+⋯+9×4+0×2=440

    2.将结果 除以 11 取余: 440mod  11=0

    3.根据校验码对照表,余数 0 对应的校验码为 1。

    因此,该身份证号码的完整形式为:112233445566778901。

    说明:

    本程序仅可判断用户输入身份证号码的正确性,且仅判断最后一位校验码是否正确。若正确,给出“合法”提示,否则给出“非法”提示并给出正确的校验码。

    四、总程序代码

    import sys
    from UI_IdentificationCard import *
    from PyQt5.QtWidgets import QApplication, QWidget
    
    # 保持窗口大小和qtdesigner中的一致
    from PyQt5 import QtCore
    QtCo编程客栈re.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)
    
    class login_interface(QWidget, Ui_Form):
        def __init__(self):
            super(QWidget, self).__init__()
            self.setupUi(self)
    
            self.label_2.setVisible(False)
            self.label_3.setVisible(False)
    
            self.pushButton.clicked.connect(self.jiaoyan)
    
        def jiaoyan(self):
            he = 0
            jiaquan_lst = [7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2]
            jiaoyan_lst = ['1','0','X','9','8','7','6','5','4','3','2']
    
            i_card = self.lineEdit.text()
            if i_card[0:16].isdigit():
                if len(i_MkvANTAcard) == 18:
                    for i in range(len(i_card)-1):
                        he = he + jiaquan_lst[i]*int(i_card[i])
                    yu = he%11
                    jiaoyanma = jiaoyan_lst[yu]
    
                    self.label_2.setVisible(True)
                    self.label_3.setVisible(True)
    
                    if str(jiaoyanma) == i_card[-1]:
                        self.label_3.setText("该身份证号码合法!")
                    else:
                        self.label_3.setText("该身份证号码非法!\n最后一位校验码应为:"+str(jiaoyanma))
                else:
                    QtWidgets.QMessageBox.critical(self, "提示", "请检查身份证号码位数!")
            else:
                QtWidgets.QMessageBox.critical(self, "提示", "请输入身份证号码!")
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        w = login_interface()
        w.show()
        sys.exit(app.exec_())
    

    到此这篇关于Python+PyQt开发证件号智能校验工具的文章就介绍到这了,更多相关Python身份证校验工具内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新开发

    开发排行榜