目錄
一、引言
二、GUI界面設計
1.相關提示
2.效果演示
3.界面設計.py
三、主要程序詳解
1.導入相關模塊
2.初始化設置
3.校驗過程
四、總程序代碼
一、引言
在數字化轉型加速的背景下,證件信息核驗已成為金融、政務、安防等領域的剛需。傳統人工校驗存在效率低、易出錯等問題,而基于PyQt框架與Python語言開發的證件號智能校驗工具,通過圖形化界面與自動化算法,實現了高效、精準的證件信息驗證,顯著降低人工核驗成本,提升數據合規性。開發靈感來源于企業實名認證、政務服務窗口、物聯網設備身份綁定等場景。
二、GUI界面設計
使用PyQt5進行界面的搭建,界面如下:
?
?
初始界面搭建采用極簡風格。當輸入合法的身份證號碼后,點擊“開始校驗”,則會出現對應提示(是合法的);否則,不僅會告知用戶此身份證號碼不合法,同時還會根據輸入身份證號碼的前17位自動計算第18位的校驗碼,最后將正確的校驗碼結果告知給用戶。
1.相關提示
若輸入非法,即出現漢字符、或位數不等于18等常見特殊情況,直接點擊“開始校驗”后,會彈出對應相關提示。
2.效果演示
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, QtWidgetsclass 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.label.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)self.label_3.setObjectName("label_3")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.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(QtCore.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 = 0jiaquan_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%11jiaoyanma = 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表示加權因子表,不同位置序號對應不同的加權因子;加權因子表和校驗碼表如下所示:
首先獲取用戶輸入框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
QtCore.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 = 0jiaquan_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%11jiaoyanma = 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_())
歡迎留言/私信溝通交流!