社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

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

菜鸟学Python • 5 年前 • 696 次点击  

今年的春节真的是魔幻像一场电影,宅在家里好多天了,有的人在客厅围绕茶几已经走了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
 
696 次点击