Python制作一个随机抽奖小工具的实现

Python制作⼀个随机抽奖⼩⼯具的实现⽬录
1. 核⼼功能设计
2. GUI设计与实现
3. 功能实现
3.1 读取⼈员名单
3.2. 随机抽奖
3.3. 保存中奖名单
3.4. GUI交互逻辑
最近在⼯作中⾯向社玩家组织了⼀场活动,需要进⾏随机抽奖,参考之前⼩明⼤佬的案例,再结合⾃⼰的需求,做了⼀个简单的随机抽奖⼩⼯具。今天我就来顺便介绍⼀下这个⼩⼯具的制作过程吧!
先看效果:
1. 核⼼功能设计
针对随机抽奖的⼩⼯具,需要可以导⼊参与抽奖的⼈员名单,然后选择不同的奖励类型进⾏随机抽取获奖名单并导出。
那么,简单进⾏需求拆解,⼤致梳理出以下核⼼功能:
名单导⼊
为了避免出现重名情况,这⾥我们约定以下⼏点:
①导⼊参与抽奖的⼈员名单⽂件(xlsx类型⽂件)
②数据第⼀列为ID,第⼆列为name
参考格式案例冷却塔布水器
奖项类型选择
奖项类型是指⼀等奖、⼆等奖这类标识语,这⾥我们内置了特等奖-六等奖共7个选项供选取
本轮⼈数
聚磷酸铵阻燃剂本轮⼈数是指每次抽奖时⼀次性抽取的获奖⼈数,默认值为5
①当填⼊的数字超过剩余未获奖⼈数时,会进⾏提⽰并显⽰未获奖⼈数
②当填⼊的数字为0表⽰轮空,也需要⼿动结束
③当填⼊的数字为负数时,点击抽奖⽆响应
④当填⼊的⾮数字时,会进⾏提⽰需要输⼊正确数字
抽奖时轮播区域
⽤于显⽰抽奖中随机滚动参与本轮抽奖的⼈员名单
⼈员名单
当选择正确的⼈员名单⽂件后,这⾥会⾃动显⽰⼈员信息列表固体增塑剂
中奖记录
记录每次抽取的奖项类型及获奖名单
开始抽奖
①开始抽奖时,会先判断抽奖设置是否满⾜条件,否则会有相关提⽰
②抽奖中点击开始抽奖会提⽰正在抽奖中
结束
①⾮抽奖状态下点击结束⽆响应
②抽奖中点击结束将显⽰本次抽奖结果
重置会清掉历史抽奖记录(含本地⽂件,如有必要建议对中奖名单留档)
②抽奖中点击重置会提⽰正在抽奖中
③⾮抽奖状态点击重置会提⽰该操作会删除历史记录,是否确认
基本功能点确认后,我们就开始进⾏GUI设计。
2. GUI设计与实现
基于功能点,我们⽤axure简单进⾏UI布局设计,然后再通过GUI开发库进⾏设计,这⾥依旧采⽤的是pysimplegui,主要是简单⽅便。
基于GUI设计,我们编码如下:
nameList_column = [
[sg.Text('⼈员名单:')],
[sg.Listbox(values=[], size=(20, 10), key='nameList')],
]
result_column = [
[sg.Text('中奖记录:')],
nand闪存
[sg.Multiline('', size=(48, 10), key='result', text_color='DeepPink')],
]
# 主题设置
sg.theme('SystemDefaultForReal')
延时电路
# 布局设置
layout = [[sg.Text('选择参与抽奖⼈员名单⽂件:', font=('微软雅⿊', 12)), sg.InputText('', key='_file', size=(50, 1), font=('微软雅⿊', 10), enable_events=True), sg.FileBrowse('打开', file_types=(('Text Files', '*.xlsx'),), size=(10, 1), font=('微软雅⿊', 11))],          [sg.Frame(layout=[
[sg.Text('本轮奖项:', font=('微软雅⿊', 12)), sg.Combo(['特等奖', '⼀等奖', '⼆等奖', '三等奖', '四等奖', '五等奖', '六等奖'], font=('微软雅⿊', 10), default_value='特等奖', size=(15, 5), key='_type'),
sg.Text('本轮⼈数:', font=('微软雅⿊', 12)), sg.InputText('5', key='_num', size=(38, 1), font=('微软雅⿊', 10))],
],
title='抽奖设置', title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='请进⾏抽奖设置后再开始抽奖')],
[sg.Multiline(size=(48, 5), font=(
'微软雅⿊', 18), text_color='Blue', key='luckyName', justification='center')],
[sg.Column(nameList_column), sg.Column(result_column)],
[sg.Text('操作说明:', font=('微软雅⿊', 12))],
[sg.Text('①先选择参与抽奖的⼈员名单xlsx⽂件,⼈员名单⽂件包含ID和name两个字段\n②获奖名单将存在⼩⼯具所在⽂件夹,重置会删除历史记录⽂件', font=('微软雅⿊', 10)),
sg.Text('', font=('微软雅⿊', 12), size=(5, 1)),
sg.Button('开始抽奖', font=('微软雅⿊', 12), button_color='Orange'),
sg.Button('结束', font=('微软雅⿊', 12), button_color='red'),
sg.Button('重置', font=('微软雅⿊', 12), button_color='red'), ],
]
# 创建窗⼝
window = sg.Window('抽奖⼩⼯具,作者@:可以叫我才哥', layout,
font=('微软雅⿊', 12), default_element_size=(50, 1))
其包含的控件如下:
Text ⽂本
InputText 输⼊⽂本框
FileBrowse ⽂件浏览
Multiline 多⾏⽂本框
Combo 下拉框
Listbox 列表
Button 按钮
需要注意的是这⾥有个Frame组件,⽤于layout嵌套,可以很好地模块化UI布局。
3. 功能实现
在本案例中,需要实现三个功能,分别是:读取⼈员名单、随机抽奖以及保存中奖名单。
3.1 读取⼈员名单
这⾥采⽤的是openpyxl读取表格数据并获得某⼏列的值,由于存在表头,所以最后不需要表头
def nameList(window):
fileName = values['_file']
try:
wb = openpyxl.load_workbook(fileName)
active_sheet = wb.active
names = [cell_object.value for cell_object in list(lumns)[1]][1:]
ids = [cell_object.value for cell_object in list(lumns)[0]][1:]
names = [name+'_'+str(id_) for name, id_ in zip(names, ids)]
window['nameList'].update(names)
return names
sg.popup('请选择正确格式的的⼈员名单⽂件', title='提⽰',)
3.2. 随机抽奖
由于我们需要⼀次随机抽取的⼈数存在多个,所以这⾥⽤的是random.sample(),需要注意的是传⼊的参数中names是需要去掉已中奖名单
def Result(window, names):
global is_run, luckyNames
_type = values['_type']                # 本轮奖项类型
_num = int(values['_num'])            # 本轮⼈数
while True:
randomName = random.sample(names, k=_num)
luckyName = '  '.join(randomName)
window['luckyName'].update(luckyName)
if not is_run:
headers = ['奖项', '名单']
toCsv(headers, [_type]*len(randomName), randomName, lucky)
luckyNames = luckyNames + _type+' : '+luckyName+'\n\n'
window['result'].update(luckyNames)
return
time.sleep(0.088)
3.3. 保存中奖名单
这⾥我们⽤的是csv库的⽅法,追加存储
def toCsv(headers, col1, col2, file):
# 存在则追加,不存在则新建
if ists(lucky):
with open(lucky, 'a', encoding='utf_8_sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerows(zip(col1, col2))
else:
with open(lucky, 'w', encoding='utf_8_sig', newline='') as csvfile:
writer = csv.writer(csvfile)
writer.writerow(headers)
writer.writerows(zip(col1, col2))
完成核⼼功能函数后,我们再进⾏GUI交互逻辑的实现。
3.4. GUI交互逻辑
这⾥有两个全局变量,其中⼀个⽤于记录当前抽奖状态,另外⼀个⽤于存储当前已经获奖的⼈员信息。关于交互逻辑的详情,⼤家可以结合核⼼功能需求及以下代码了解。# 初始状态
is_run = False
luckyNames = ''
# 事件循环
while True:
event, values = ad()
if event in (None, '关闭程序'):
break
if event == '_file':
nameList(window)
担架车
if event == '开始抽奖':
if is_run:
sg.popup('抽奖进⾏中,⽆需重复操作......', title='提⽰')
continue
try:
names = nameList(window)              # ⼈员名单
_num = int(values['_num'])            # 本轮⼈数
lucky = '中奖名单.csv'                # 中奖名单
if ists(lucky):
with open('中奖名单.csv', 'r', encoding='utf_8_sig') as f:
reader = ader(f)
selectedNames = set([i[1] for i in reader][1:])
names_set = set(names)-selectedNames
else:
names_set = set(names)
if len(names_set) >= _num:
is_run = True
_thread.start_new_thread(Result, (window, names_set))
else:
sg.popup(
f'请选择正确本轮抽奖⼈数(当前 {len(names_set)} 个未中奖⼈数)', title='提⽰')
except:
sg.popup('请选择正确本轮抽奖⼈数(别超过总⼈数哦)', title='提⽰')
elif event == '结束':
is_run = False
elif event == '重置':
if is_run:
sg.popup('抽奖进⾏中,请等待抽奖结束后重置...', title='提⽰')
continue
yes_no = sg.popup_yes_no(
'重置会清楚历史数据,是否执⾏此操作??', text_color='red', title='提⽰')
if yes_no == 'Yes':
try:
luckyNames = ''
window['result'].update(luckyNames)
window['luckyName'].update(luckyNames)
sg.popup('抽奖历史记录已被重置......', title='提⽰')
except:
sg.popup('⽆抽奖历史记录......', title='提⽰')
window.close()
基于此,我们就完成了随机抽奖⼩⼯具的制作。
启动页如下:
最后,⼤家感兴趣就可以将代码打包成exe可执⾏⽂件了,我这边打包下来⼤概10MB左右⼤⼩。
到此这篇关于Python制作⼀个随机抽奖⼩⼯具的实现的⽂章就介绍到这了,更多相关Python 随机抽奖⼩⼯具内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!

本文发布于:2024-09-23 19:27:22,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/2/178306.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:名单   需要   重置   功能   点击   获奖   实现   抽取
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议