我想用python写一个身份证信息查询系统,要运用Qt界面,要求是使用字典存储区域代码和对应的行政区域信息,用户输入身份证号码,点击查询,可以显示出对应的地区,生日,性别等在身份证号码上能够读取出内容,在查询后可以点击保存将改内容存储为csv文件,请输出完整代码
时间: 2024-04-01 13:35:59 浏览: 80
好的,以下是一个简单的身份证信息查询系统的代码,使用了Python和PyQt5框架:
```
import csv
from datetime import datetime
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QLineEdit, QPushButton, QMessageBox
class IdCardInfo:
def __init__(self):
self.area_code_dict = {}
self.birthdate = ''
self.gender = ''
self.area = ''
def parse_id_card(self, id_card):
if len(id_card) != 18:
return False
self.area = self._parse_area_code(id_card[0:6])
self.birthdate = self._parse_birthdate(id_card[6:14])
self.gender = self._parse_gender(id_card[16])
return True
def _parse_area_code(self, area_code):
if not self.area_code_dict:
with open('area_code.csv', newline='', encoding='utf-8') as csvfile:
reader = csv.reader(csvfile)
for row in reader:
self.area_code_dict[row[0]] = row[1]
return self.area_code_dict.get(area_code, '')
def _parse_birthdate(self, birthdate_str):
try:
birthdate = datetime.strptime(birthdate_str, '%Y%m%d').date()
return birthdate.strftime('%Y-%m-%d')
except ValueError:
return ''
def _parse_gender(self, gender_str):
if int(gender_str) % 2 == 0:
return '女'
else:
return '男'
class IdCardQueryWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle('身份证信息查询')
self.setFixedSize(500, 300)
self.input_label = QLabel(self)
self.input_label.setText('请输入身份证号码:')
self.input_label.move(50, 50)
self.input_edit = QLineEdit(self)
self.input_edit.move(200, 50)
self.input_edit.setFixedWidth(200)
self.query_button = QPushButton(self)
self.query_button.setText('查询')
self.query_button.move(200, 100)
self.query_button.clicked.connect(self.query_id_card_info)
self.area_label = QLabel(self)
self.area_label.setText('地区:')
self.area_label.move(50, 150)
self.area_edit = QLineEdit(self)
self.area_edit.setReadOnly(True)
self.area_edit.move(200, 150)
self.area_edit.setFixedWidth(200)
self.birthdate_label = QLabel(self)
self.birthdate_label.setText('生日:')
self.birthdate_label.move(50, 200)
self.birthdate_edit = QLineEdit(self)
self.birthdate_edit.setReadOnly(True)
self.birthdate_edit.move(200, 200)
self.birthdate_edit.setFixedWidth(200)
self.gender_label = QLabel(self)
self.gender_label.setText('性别:')
self.gender_label.move(50, 250)
self.gender_edit = QLineEdit(self)
self.gender_edit.setReadOnly(True)
self.gender_edit.move(200, 250)
self.gender_edit.setFixedWidth(200)
def query_id_card_info(self):
id_card = self.input_edit.text().strip()
id_card_info = IdCardInfo()
if id_card_info.parse_id_card(id_card):
self.area_edit.setText(id_card_info.area)
self.birthdate_edit.setText(id_card_info.birthdate)
self.gender_edit.setText(id_card_info.gender)
QMessageBox.information(self, '查询结果', '查询成功')
self._save_to_csv(id_card, id_card_info.area, id_card_info.birthdate, id_card_info.gender)
else:
QMessageBox.warning(self, '查询结果', '身份证号码格式不正确')
def _save_to_csv(self, id_card, area, birthdate, gender):
with open('id_card_info.csv', mode='a', newline='', encoding='utf-8') as csvfile:
writer = csv.writer(csvfile)
writer.writerow([id_card, area, birthdate, gender])
if __name__ == '__main__':
app = QApplication([])
win = IdCardQueryWindow()
win.show()
app.exec_()
```
其中,`IdCardInfo`是一个类,用于解析身份证号码并保存对应的地区、生日和性别信息。`_parse_area_code`方法从`area_code.csv`文件中读取区域代码和对应的行政区域信息,使用了Python内置的csv模块。`_parse_birthdate`方法将身份证号码中的生日字符串转换为`datetime.date`对象,并格式化为`YYYY-MM-DD`的字符串。`_parse_gender`方法解析身份证号码中的性别信息,偶数表示女性,奇数表示男性。
`IdCardQueryWindow`是一个继承自`QMainWindow`的窗口类,用于显示GUI界面。它包含一个输入框、一个查询按钮和三个只读的文本框,分别用于显示地区、生日和性别信息。当用户点击查询按钮时,会解析输入的身份证号码,并将解析结果显示在对应的文本框中,同时弹出一个信息框提示查询成功。如果身份证号码格式不正确,则弹出一个警告框提示用户。查询结果会以CSV格式保存到`id_card_info.csv`文件中。
注意:这是一个简单的示例代码,仅供参考。在实际应用中,需要考虑更多的异常情况和错误处理。
阅读全文