Hi,我是山月。
明天就是元旦的最后一天了,通过you-get看了两天视频的山月终于打算收收心了。
元旦一过,感觉过年就近在咫尺了,这不,群里早就开始讨论起年会的节目安排了。
说起年会,印象最深刻的莫过于抽奖环节了,可惜奖运一直不太行💔💔💔
但作为一个Python学习者,我不禁想着:能不能通过Python做个抽奖?
说干就干。因此就有了这篇文章。效果👇
第一步,我们得先做好准备工作:整理年会参与者的名单。
山月把名单储存在了excel表格里👇
因此,我们首先要想办法读取excel表格,得到所有参会人员的姓名,为了防止姓名重复,我们也需要把姓名对应的工号读取出来。
读取excel,大家脑海中有没有浮现出实现的办法?山月立马想到了xlrd
实现代码:
import xlrd
data= xlrd.open_workbook("员工名单.xlsx")
work_sheet = data.sheet_by_index(0)
rows_generator = list(work_sheet.get_rows())[1:] #去除表头
name_list=[]
for rows in rows_generator:
number, name = int(rows[0].value), rows[1].value
name_date =' {} ({}) '.format(name, number) #以姓名(工号)的形式处理数据
name_list.append(name_date)
print(name_list)
结果:
[' 王晓霞 (2021001) ', ' 刘旭 (2021002) ', ' 斯基 (2021003) ', ' 乌拉 (2021004) ', ' 卡卡 (2021005) ', ' 王屋山 (2021006) ', ' 罗茨 (2021007) ', ' 纪实 (2021008) ', ' 阿
斯顿 (2021009) ', ' 阿思翠 (2021010) ', ' 孙菲菲 (2021011) ', ' 水水 (2021012) ', ' 十三 (2021013) ', ' 十四 (2021014) ', ' 孙师傅 (2021015) ', ' 三律 (2021016) ', ' 楼望
(2021017) ', ' 妮妮 (2021018) ', ' 可可 (2021019) ', ' 飞飞 (2021020) ', ' 胖胖 (2021021) ', ' 冰冰 (2021022) ', ' 彬彬 (2021023) ', ' 萍儿 (2021024) ', ' 丹丹 (2021025) ', ' 瑶瑶 (2021026) ', ' 吴杰 (2021027) ', ' 梁二 (2021028) ', ' 宋三 (2021029) ']
bingo🤞,完成。
第二步就是来实现我们的抽奖界面啦。
用到的是tkinter
代码:
import random
import tkinter as tk
class lottery(object):
def __init__(self):
self.windows = tk.Tk()
self.windows.title("年会抽奖")
self.windows.geometry('880x500+50+100')
self.windows.configure(bg='red')
text_prize = '''奖项\n\n一等奖:1名\n\n二等奖:3名\n\n三等奖:5名\n\n幸运奖:10名'''
self.prize_label = tk.Label(self.windows,text = text_prize,font='楷体 -20 bold', width=30, height=21, bg='yellow')
self.prize_label.place(x=22, y=30)
self.prize_label = tk.Label(self.windows, text='* * 公 司 2021 年 年 会', width=38, height=3, bg='yellow',
font='楷体 -20 bold')
self.prize_label.place(x=400, y=30)
self.var1 = tk.StringVar(value='中 奖 中 奖 !')
self.award_label = tk.Label(self.windows, textvariable = self.var1, width=20, height=3, bg='yellow',
font='楷体 -40 bold')
self.award_label.place(x=400, y=120)
self.button_start = tk.Button(self.windows, text='开始', command=lambda: self.award_start(self.var1, self.var2),
width=14, height=2, bg='yellow',font='楷体 -18 bold')
self.button_start.place( x=400, y=280)
self.button_end = tk.Button(self.windows, text='结束', command=lambda: self.award_end(),width=14, height=2, bg='yellow',
font='楷体 -18 bold')
self.button_end.place( x=670, y=280)
self.var2 = tk.StringVar(value='大 奖 来 袭 !')
self.congratulate_label = tk.Label(self.windows, textvariable = self.var2, width=38, height=3, bg='yellow',
font='楷体 -20 bold')
self.congratulate_label.place( x=400, y=380)
self.start = True
self.runing = False
self.name_list = ['员工1','员工2','员工13','员工4','员工5','员工6','员工7','员工8','员工9','员工10'] #员工名单
#开始按钮关联的函数
def award_start(self, var1, var2):
global start, runing
award_name = random.choice(self.name_list) #随机在列表里抽取一个数据
self.var1.set(award_name)
if self.start:
self.windows.after(50, self.award_start, self.var1, self.var2)
self.runing = True
var2.set('猜猜是不是你!!!')
else:
self.var2.set('恭喜{},你就是全场最亮的崽!!!'.format(award_name))
self.start = True
#结束按钮关联的函数
def award_end(self):
global start, runing
if self.runing:
self.start = False
def run(self):
self.windows.mainloop()
if __name__=="__main__":
app = lottery()
app.run()
效果:
下面我们来说下实现的重点:开始和结束按钮关联的函数。
借助的两个变量:start(开始)和running(运行中)的初始值:
self.start = True
self.runing = False
1)开始函数
def award_start(self, var1, var2):
global start, runing
award_name = random.choice(self.name_list) #随机在列表里抽取一个数据
self.var1.set(award_name)
if self.start:
self.windows.after(50, self.award_start, self.var1, self.var2)
self.runing = True
var2.set('猜猜是不是你!!!')
else:
self.var2.set('恭喜{},你就是全场最亮的崽!!!'.format(award_name))
self.start = True
首先利用global把start和running变量变成全局变量。
然后通过random.choice在列表里随机抽取一个元素,这个元素就是我们抽中的名单。并把抽中的姓名写入到award_label标签里去。
最后我们来判断,变量start的值:
- 如果变量start是True,通过after不断的重新调用award_start函数,然后把变量running由初始值False定义为True,并在congratulate_label标签里写入文本【猜猜是不是你】
- 如果变量start是False,在congratulate_label标签里写入文本【恭喜...】,并把变量start定义为True。
2)结束函数
def award_end(self):
global start, runing
if self.runing:
self.start = False
首先利用global把start和running变量变成全局变量。
然后当变量running的值为True的时候,把start的值定义为False。
3)总结
因为start(开始)的初始值为True,所以当我们点击开始按钮后,它会直接走start值为True的步骤,直到我们按了结束按钮,把start的值变成了False。
如果我们再次点击开始进行抽奖,由于这个时候start的值是False,所以我们先走start的值是False的步骤,把start的值变成True,再重新走start值是True的步骤。
现在,读取excel文档和抽奖界面我们都实现了,接下来需要做的就是把抽奖界面里的名单列表变成我们从excel读取出来的结果。
大家一起来试试吧,也可以借此检验下你的学习成果哦。
已经到底啦~(≧▽≦*)/~