Py学习  »  Python

宅在家太无聊了,我用Python做了一个能作弊的抽奖程序

菜鸟学Python • 4 年前 • 555 次点击  

今年的春节真的是魔幻像一场电影,宅在家里好多天了,有的人在客厅围绕茶几已经走了1万步了,有的人没事在客厅放几个玩具,扔圈圈玩。太无聊了,Python好久不写了,赶紧操练起来,反正闲着也是无聊。年前公司年会,我成功的避开了8轮抽奖,一个都没有抽到。说起来就很生气~~



既然是玩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版本的抽奖,网页抽奖更酷!



另外春节宅在家非常无聊,我把几年前的一个小号重新开了,有空写点非技术的八卦新闻,定期发点福利,欢迎来撩吧。


程序猿Leo

一位80后资深码农,玩技术,做产品


获取源码:【菜鸟版抽奖


情人节还有10几天了,我已经累计牵线了8对,想要脱单的抓紧啦


 点击阅读原文,30秒火速脱单

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/53919
 
555 次点击