- Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)
- 一、效果和需求
- 二、技术选型
- 三、核心实现思路
- 1)界面布局
- 2)导入花名册
- 3)滚动抽奖
- 4)导出中奖名单
- 四、关键代码片段
- 启动滚动
- 滚动刷新
- 停止并记录中奖
- 五、可继续升级的方向
- 六、总结
- 完整代码
Python + PyQt5 实战:做一个公司抽奖小工具(支持导入花名册)
很多时候我们做活动抽奖,只需要一个简单、稳定、界面直观的小程序。
这篇文章带你从 0 到 1,用 Python + PyQt5 写一个“公司抽奖工具”,并支持导入花名册(txt/csv/xlsx)。
工具源码:
我用夸克网盘给你分享了「分享-公司抽奖源代码版.zip」,点击链接或复制整段内容,打开「夸克网盘APP」即可获取。
/~21913YT6Fz~:/
链接:https://pan.quark.cn/s/490498be20c3

一、效果和需求
先明确目标:
- 能导入花名册
- 点击开始后,姓名快速滚动
- 点击停止后,定格中奖人
- 支持“中奖不重复”
- 中奖名单可导出
这个需求不复杂,但非常实用,适合拿来练手 GUI 和文件读取。
二、技术选型
PyQt5:快速搭建桌面图形界面QTimer:定时刷新候选姓名,制造“滚动”效果csv/pathlib:读取和导出名单文件openpyxl(可选):读取 Excel 花名册
安装命令:
pip install pyqt5 openpyxl
三、核心实现思路
1)界面布局
主界面大致包含 4 块:
- 标题和当前滚动姓名显示区
- 状态区(总人数、可抽人数、当前状态)
- 操作区(导入、开始、停止、重置、导出等按钮)
- 列表区(花名册、中奖名单)
PyQt5 中用 QVBoxLayout 和 QHBoxLayout 组合即可。
2)导入花名册
通过 QFileDialog.getOpenFileName 选择文件,然后根据后缀读取:
.txt:按行读取.csv:逐行逐列读取非空单元格.xlsx:读取活动工作表的非空单元格
最后做一次“去重并保持顺序”,避免名单重复。
3)滚动抽奖
用 QTimer 每 80ms 执行一次:
- 从可抽名单里
random.choice(...)选一个名字 - 实时更新到大号
QLabel
点击“停止”后:
- 停止定时器
- 当前显示名记为中奖人
- 如果开启“不重复”,就从可抽名单移除该姓名
4)导出中奖名单
支持导出 csv 和 txt:
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 桌面应用,这个案例值得自己完整敲一遍。