200字
Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)
2026-05-08
2026-05-08
  • Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)
    • 一、效果和需求
    • 二、技术选型
    • 三、核心实现思路
      • 1)界面布局
      • 2)导入花名册
      • 3)滚动抽奖
      • 4)导出中奖名单
    • 四、关键代码片段
      • 启动滚动
      • 滚动刷新
      • 停止并记录中奖
    • 五、可继续升级的方向
    • 六、总结
    • 完整代码

Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)

很多时候我们做活动抽奖,只需要一个简单、稳定、界面直观的小程序。
这篇文章带你从 0 到 1,用 Python + PyQt5 写一个“公司抽奖工具”,并支持导入花名册(txt/csv/xlsx)。

工具源码:

我用夸克网盘给你分享了「分享-公司抽奖源代码版.zip」,点击链接或复制整段内容,打开「夸克网盘APP」即可获取。
/~21913YT6Fz~:/
链接:https://pan.quark.cn/s/490498be20c3

PixPin_2026-05-02_22-50-12.gif

一、效果和需求

先明确目标:

  • 能导入花名册
  • 点击开始后,姓名快速滚动
  • 点击停止后,定格中奖人
  • 支持“中奖不重复”
  • 中奖名单可导出

这个需求不复杂,但非常实用,适合拿来练手 GUI 和文件读取。

二、技术选型

  • PyQt5:快速搭建桌面图形界面
  • QTimer:定时刷新候选姓名,制造“滚动”效果
  • csv / pathlib:读取和导出名单文件
  • openpyxl(可选):读取 Excel 花名册

安装命令:

pip install pyqt5 openpyxl

三、核心实现思路

1)界面布局

主界面大致包含 4 块:

  • 标题和当前滚动姓名显示区
  • 状态区(总人数、可抽人数、当前状态)
  • 操作区(导入、开始、停止、重置、导出等按钮)
  • 列表区(花名册、中奖名单)

PyQt5 中用 QVBoxLayoutQHBoxLayout 组合即可。

2)导入花名册

通过 QFileDialog.getOpenFileName 选择文件,然后根据后缀读取:

  • .txt:按行读取
  • .csv:逐行逐列读取非空单元格
  • .xlsx:读取活动工作表的非空单元格

最后做一次“去重并保持顺序”,避免名单重复。

3)滚动抽奖

QTimer 每 80ms 执行一次:

  • 从可抽名单里 random.choice(...) 选一个名字
  • 实时更新到大号 QLabel

点击“停止”后:

  • 停止定时器
  • 当前显示名记为中奖人
  • 如果开启“不重复”,就从可抽名单移除该姓名

4)导出中奖名单

支持导出 csvtxt

  • txt:一行一个中奖人
  • csv:输出“序号、姓名”两列,方便后续统计

四、关键代码片段

启动滚动

def start_lottery(self):
    if not self.available_names:
        QMessageBox.information(self, "提示", "当前没有可抽取人员,请先导入或重置。")
        return

    self.timer.start()
    self.is_rolling = True
    self.start_btn.setEnabled(False)
    self.stop_btn.setEnabled(True)

滚动刷新

def roll_name(self):
    if not self.available_names:
        self.timer.stop()
        self.is_rolling = False
        return

    self.current_name = random.choice(self.available_names)
    self.name_label.setText(self.current_name)

停止并记录中奖

def stop_lottery(self):
    self.timer.stop()
    self.is_rolling = False

    winner = self.current_name
    self.winners.append(winner)

    if self.no_repeat_box.isChecked() and winner in self.available_names:
        self.available_names.remove(winner)

五、可继续升级的方向

如果你想做成“正式活动工具”,可以继续加:

  • 一次抽取多人(如一次 3 人)
  • 分奖项抽取(一等奖、二等奖、三等奖)
  • 指定部门抽奖
  • 历史记录持久化(JSON / SQLite)
  • 全屏模式与大屏展示主题

六、总结

这个项目非常适合初学者练习:

  • GUI 事件绑定
  • 定时器与状态管理
  • 多格式文件导入
  • 简单业务逻辑拆分

代码不长,但非常贴近真实需求。
如果你正在学习 Python 桌面应用,这个案例值得自己完整敲一遍。

完整代码

Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)
作者
一晌小贪欢
发表于
2026-05-08
License
CC BY-NC-SA 4.0

评论