
宅在家太无聊了,我用Python做了一个能作弊的抽奖程序
马上就要元旦了,可以宅在家里好多天了,不会还有人在客厅围绕茶几走1万步了,在客厅放几个玩具,扔圈圈玩。太无聊了,Python好久不写了,赶紧操练起来,反正闲着也是无聊,可以试试写这个抽奖小程序说不定可以在年前公司年会获得大奖呢~
既然是玩Python的不如自己动手写一个抽奖软件,我们设置一等奖,二等奖,三等奖。
一等奖我们放华为手机,二等奖我们放扫地机器人,三等奖我们放手环。(当然这个可以自己设置),而且还留一个后门(嘿嘿,可以作弊哦,这个最后讲)。小伙伴快来一起看一下吧。
01.设计界面
明确我们的程序需要实现哪些功能:
- 界面各个组件的位置,例如软件题目的位置,名单的摆放位置等等。
- 如何实现抽奖的功能,让名字滚动起来
- 如何切换不同的奖品等级
我们先来确定各个组件的摆放位置,这个其实很简单,首先,我们利用tkinter的画布功能,确定我们的画布大小,然后在画布上的具体位置摆放我们的画布大小即可。
例如上图中画布上方的老鼠图案,其程序如图所示。通过Image读入老鼠的图案,然后将其调整为合适的大小,然后通过tkinter的Label类来显示出图片,并规定好图片的摆放位置即可。图中的其他图片和Text类也是采用同样的方式进行处理即可,区别在于Text不需要插入图片,只需要规定其Text类的位置和大小即可。
02.让图片滚动起来
现在我们实现了界面的展示,那么我们如何实现去让界面动起来,也就是让名字滚动起来抽奖呢,我们只需要创建一个新的线程,并在新的线程里实现对于数据的动态滚动切换,程序如下所示:
我们通过不断的切换抽奖按钮,来实现新建线程,在新建的线程里,我们通过向界面右侧不断的插入我们选出来的候选人,然后判断该等级下的名额是否已满,如果名额已满,则弹出提示对话框,就想这样:
关键的线程程序如下:
def rounds(self):
if self.isloop == True: # 判断是否开始循环
return
while True:
if self.isloop == False:
self.flag += 1
if self.flag == 2:
self.flag = 0
if self.target == self.prise and self.name in self.data:
self.btn1['text'] = self.name
print(self.btn1['text'])
if len(self.name) == 2:
r = self.name[0] + " " + self.name[1]
else:
r = self.name
else:
while self.btn1['text'] == self.name:
temp = random.choice(self.data)
if len(temp) == 2:
r = temp[0] + " " + temp[1]
else:
r = temp
self.btn1['text'] = r
if self.newloop == True:
self.newloop = False
if self.target.size()>=5:
if self.target == self.thirdwinner1:
self.target = self.thirdwinner2
else:
self.btn1['text'] = "OVER"
tkinter.messagebox.showinfo('提示', "恭喜拉!中奖名单已产生")
return
self.target.insert(tkinter.END, r.center(5," "))
self.data.remove(r)
self.namelist.delete(1.0, 'end')
self.namelist.insert(tkinter.END, (" ").join(self.data))
return
time.sleep(0.1) # 延时操作
temp = random.choice(self.data)
if len(temp) == 2:
r = temp[0]+" "+temp[1]
else:
r = temp
self.btn1['text'] = r
线程程序中,self.target就是我们的目标list,我们只需要选出名字,然后在目标的list中插入名字即可。
这就实现了我们让抽奖界面动起来的目的,那下面我们如何实现切换不同的奖品等级呢,答案就在我们的图标设置上,我们一共有三种图标设置,分别对应一二三等奖,一等奖是手机,二等奖是扫地的机器人,三等奖是手环。
我们只需要点击不同的图标设置,便会切换不同的奖品抽取,也就是切换我们的self.target所对应的list。
03.抽奖作弊
每次抽奖都不中,不如给自己留一个暗门,如果想让某一个人或者自己能中奖,我们只要加一行代码即可。
思路其实很简单,就是我们在设计抽奖类的地方,我们传入一个参数写好的名字,如果名单在namelist里面,那么这个人必中。比如我把中奖名单里面改成我自己。
整个抽奖程序做的有点粗糙,没有细细打磨。用Python自带的tk做的,其实还有很多地方可以改善和优化,有兴趣的小伙伴可以拿源码自己改改,写写代码也是很有趣的。
后面我们会开发一个Flask版本的抽奖,网页抽奖更酷!