一、引言

在企业、学校、园区等场景中,来访人员登记是安全管理的重要环节。传统纸质登记方式存在效率低、易丢失、查询困难等问题,而基于 Python 的图形化登记系统能有效解决这些痛点。本文将详细解析一个功能完整的来访人员登记系统,该系统基于 PyQt5 实现可视化界面,支持信息录入、查询、修改、删除及 Excel 导出,适用于中小型机构的人员管理场景。

二、技术架构与环境准备

(一)技术选型

  • 界面框架:PyQt5(跨平台 GUI 开发,提供丰富的 UI 组件)

  • 数据存储:文本文件(临时存储,支持快速读写)+ xlwt(Excel 导出)

  • 核心特性

    • 三标签页设计(录入 / 查询 / 导出)

    • 登录验证机制

    • 表格数据展示与右键菜单操作

    • 日期范围查询与日历组件

(二)环境配置

  1. 依赖安装:

    bash

    pip install pyqt5 xlwt
    

  2. 资源准备:

    • 图标文件、背景图片(需与代码中的路径匹配)

    • 字体文件(示例中使用黑体,系统默认字体可省略)

三、核心功能模块解析

(一)登录验证模块:安全访问控制

python

class LoginDialog(QDialog):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("欢迎登录")
        self.login_id = QLineEdit()
        self.login_id.setPlaceholderText("请输入账号")
        self.passwd = QLineEdit()
        self.passwd.setPlaceholderText("请输入密码")
        self.passwd.setEchoMode(QLineEdit.Password)  # 密码掩码
        self.button_enter.clicked.connect(self.verify)
    
    def verify(self):
        if self.login_id.text() == "admin" and self.passwd.text() == "wang5083102":
            self.accept()  # 验证通过,打开主界面
        else:
            QMessageBox.information(self, "提示", "账号或密码错误")


  • 安全设计

    • 密码输入框使用QLineEdit.Password模式隐藏输入内容

    • 硬编码账号密码(生产环境建议改为数据库或配置文件存储)

    • 窗口禁用关闭按钮(setWindowFlags(Qt.WindowCloseButtonHint)),强制用户通过登录 / 退出操作

(二)信息录入模块:多字段表单处理

python

def tab1UI(self):
    # 表单组件布局
    self.line_edit_name = QLineEdit()  # 姓名输入框
    self.line_edit_gender = QComboBox()  # 性别下拉菜单
    self.line_edit_gender.addItems(["男", "女"])
    self.line_edit_birthday = QDateTimeEdit()  # 日期选择组件
    self.line_edit_birthday.setDisplayFormat("yyyy-MM-dd")  # 固定日期格式
    self.text_edit_note = QTextEdit()  # 多行文本框(来访目的)
    
    # 录入逻辑
    def add_new_student_info(self):
        infos = [name, gender, ...]
        if "" in infos:
            QMessageBox.warning(self, "提示", "信息不能为空")
        else:
            # 生成唯一编号(前缀+时间戳+随机数)
            person_no = f"DD{datetime.now().strftime('%Y%m%d%H%M%S')}{random.randint(10000, 99999)}"
            with open("infos.txt", "a+") as f:
                f.write(",".join([person_no] + infos) + "\n")


  • 交互优化

    • 使用QDateTimeEdit组件实现日历弹出选择日期

    • 表单字段完整性校验(空值提示)

    • 唯一编号生成规则(业务前缀 + 时间戳 + 随机数)

(三)数据查询与管理模块:表格交互与过滤

python

def tab2UI(self):
    # 表格初始化
    self.table_infos = QTableWidget()
    self.table_infos.setColumnCount(11)
    self.table_infos.setHorizontalHeaderLabels([
        "编号", "姓名", "性别", "访次", "学历", "电话", "职业", "地址", "年龄", "到访日期", "访谈内容"
    ])
    self.table_infos.setSelectionBehavior(QAbstractItemView.SelectRows)  # 整行选择
    
    # 右键菜单
    self.table_infos.setContextMenuPolicy(Qt.CustomContextMenu)
    self.table_infos.customContextMenuRequested.connect(self.generate_menu)
    def generate_menu(self, pos):
        menu = QMenu()
        menu.addAction("修改").triggered.connect(self.edit_info)
        menu.addAction("删除").triggered.connect(self.delete_info)
        menu.exec_(self.table_infos.mapToGlobal(pos))
    
    # 条件查询
    def search_info_from_files(self):
        search_type = self.select_btn.currentText()
        if search_type == "到访日期范围":
            start = self.line_edit_star_time.date()
            end = self.line_edit_end_time.date()
            # 日期范围过滤逻辑
        # ... 其他查询条件处理 ...


  • 关键特性

    • 表格支持整行选择(SelectRows模式)

    • 右键菜单实现快捷修改 / 删除(通过QMenu动态生成)

    • 多条件查询(支持姓名、性别、日期范围等维度)

    • 数据格式化:单元格内容居中显示(setTextAlignment(Qt.AlignHCenter)

(四)数据导出模块:Excel 文件生成

python

def tab3UI(self):
    self.btn_check = QPushButton("导出信息")
    self.btn_check.clicked.connect(self.export_to_excel)
    
def export_to_excel(self):
    workbook = xlwt.Workbook(encoding="utf-8")
    sheet = workbook.add_sheet("来访记录")
    # 写入表头
    headers = ["编号", "姓名", "性别", ...]
    for col, header in enumerate(headers):
        sheet.write(0, col, header)
    # 写入数据行
    with open("infos.txt", "r") as f:
        for row, line in enumerate(f.readlines()):
            data = line.strip().split(",")
            for col, item in enumerate(data):
                sheet.write(row+1, col, item)
    workbook.save("来访记录.xls")
    QMessageBox.information(self, "提示", "导出成功")


  • 技术实现

    • 使用 xlwt 库创建 Excel 文件

    • 支持批量导出文本文件中的所有记录

    • 导出次数统计(界面显示累计导出次数)

四、技术亮点与优化点

(一)界面设计

  • 多标签页架构:通过QTabWidget实现功能模块分离,提升操作效率

  • 响应式布局:使用QGridLayout和绝对定位(setGeometry)结合,适配不同屏幕尺寸

  • 视觉反馈:错误提示(QMessageBox.warning)、成功通知(QMessageBox.information

(二)数据处理

  • 文件存储格式:文本文件以逗号分隔(CSV 格式),方便后续导入数据库

  • 日期处理:统一使用yyyy-MM-dd格式,避免时区和格式混乱问题

  • 唯一标识:自动生成带业务前缀的唯一编号,便于数据追溯

(三)扩展性设计

  1. 数据库升级:当前使用文本文件存储,可扩展为 SQLite/MySQL 数据库,提升数据管理能力

  2. 权限管理:增加用户角色(管理员 / 普通用户),限制部分操作权限

  3. 数据可视化:新增统计模块,通过 Matplotlib 生成来访频率、地域分布等图表

五、注意事项与改进方向

  1. 数据安全

    • 敏感信息(如密码)避免硬编码,建议使用配置文件或环境变量

    • 文本文件存储存在性能瓶颈,大规模数据建议迁移至数据库

  2. 用户体验

    • 输入框增加格式校验(如手机号正则匹配、身份证号长度检查)

    • 表格支持排序和分页,提升大数据量下的查询效率

  3. 异常处理

    • 添加文件读写异常捕获(如权限不足、文件损坏)

    • 防止重复提交(录入按钮点击后禁用,直到操作完成)

六、总结

本文介绍的来访人员登记系统实现了从界面交互到数据管理的完整流程,具备以下优势:


  • 跨平台性:基于 PyQt5 开发,支持 Windows/macOS/Linux 系统

  • 功能完备:覆盖登记、查询、修改、删除、导出全流程

  • 可扩展性:模块化设计便于后续功能迭代(如对接门禁系统、短信通知)


通过该系统,机构可实现来访信息的数字化管理,提升安全管控效率。对于开发者而言,可进一步探索以下方向:


  • 集成 OCR 技术实现身份证信息自动识别

  • 使用 PyInstaller 打包为独立 exe 程序,方便非技术用户部署

  • 增加数据加密功能,保障存储安全


完整代码已在 GitHub 开源(链接待补充),欢迎 Star 和提交 Issue!