抽奖系统(基于Tkinter)

一、抽奖规则及使用方法

抽奖规则: 从1-138个号码中随机抽奖,共进行n轮抽奖,每个号码仅有一次中奖机会,即已中奖的号码不会再次中奖。
使用方法: 要求开始抽奖后屏幕上随机滚动显示中奖号码,点击"STOP"之后,滚动停止,此时所显示的号码为本轮中奖号码;点击"清空内容"后方可再次抽奖。

二、实现代码

python 复制代码
from tkinter import *

import numpy as np
from PIL import Image, ImageTk
import random
import pandas as pd
from time import sleep
import threading#线程

class Application():

    def __init__(self,app=None):
        self.app=app
        self.application()
        self.n=0#执行次数
        self.flag=True
    def application(self):
        #农行logo
        self.image=Image.open('abc300.png')
        self.abc_logo=ImageTk.PhotoImage(self.image)
        self.label0=Label(self.app,image=self.abc_logo)
        self.label0.pack()
        # 抽奖系统
        self.label1 = Label(self.app, text='抽奖系统', font=('黑体', 30), bg='white').pack()

        #开始抽奖按钮
        global number_pool
        number_pool=[i for i in range(1,139)]



        def raffle():
            self.flag=True
            if self.n==0:#第一轮抽奖
                while self.flag:
                    luck_numbers = []
                    number_pool2=number_pool.copy()
                    for i in range(50):
                        re=random.choice(number_pool2)
                        number_pool2.remove(re)
                        luck_numbers.append(re)
                    arr=np.array(luck_numbers).reshape(5,10)
                    printf(arr)
                #从奖池中删除已中奖号码
                for i in luck_numbers:
                    number_pool.remove(i)
                print('luck_numbers=',luck_numbers)
                print('number_pool=', number_pool)
                self.n += 1
            elif self.n==1:#第二轮抽奖
                while self.flag:
                    luck_numbers = []
                    number_pool2=number_pool.copy()
                    for i in range(20):
                        re=random.choice(number_pool2)
                        number_pool2.remove(re)
                        luck_numbers.append(re)
                    arr=np.array(luck_numbers).reshape(2,10)
                    printf(arr)
                #从奖池中删除已中奖号码
                for i in luck_numbers:
                    number_pool.remove(i)
                print('luck_numbers=',luck_numbers)
                print('number_pool=', number_pool)
                self.n += 1
            elif self.n==2:#第三轮抽奖
                while self.flag:
                    luck_numbers = []
                    number_pool2=number_pool.copy()
                    for i in range(10):
                        re=random.choice(number_pool2)
                        number_pool2.remove(re)
                        luck_numbers.append(re)
                    arr=np.array(luck_numbers).reshape(1,10)
                    printf(arr)
                #从奖池中删除已中奖号码
                for i in luck_numbers:
                    number_pool.remove(i)
                print('luck_numbers=',luck_numbers)
                print('number_pool=', number_pool)
                self.n += 1
            elif self.n==3:#第四轮抽奖
                while self.flag:
                    luck_numbers = []
                    number_pool2=number_pool.copy()
                    for i in range(10):
                        re=random.choice(number_pool2)
                        number_pool2.remove(re)
                        luck_numbers.append(re)
                    arr=np.array(luck_numbers).reshape(1,10)
                    printf(arr)
                #从奖池中删除已中奖号码
                for i in luck_numbers:
                    number_pool.remove(i)
                print('luck_numbers=',luck_numbers)
                print('number_pool=', number_pool)
                self.n += 1
            else:
                self.label0 = Label(self.app, text='本次抽奖结束。', font=('黑体', 20), bg='white')
        def printf(arr):#显示中奖结果
            arr = pd.DataFrame(arr)  # 将numpy.array转换为pandas.dataframe
            arr = arr.set_index(0)  # 将第一列设置为行索引
            arr.index.name = None  # 将行索引名称设置为None
            arr = arr.to_string(header=False)  # 转化为字符形式,并去掉列索引
            print('arr=',arr)
            self.label0 = Label(self.app, text='第%d轮抽奖中奖号码'%(self.n+1), font=('黑体', 20), bg='white')
            self.label0.pack()
            self.label1 = Label(self.app, text=arr, font=('黑体', 20), bg='white')
            self.label1.pack()
            self.app.update()
            sleep(0.02)
            if self.flag==True:
                delete_content()
        #def get_start(arr):
        #   T1 = threading.Thread(name='label0',
        #                          target=printf(arr),
        #                          daemon=True)
        #    T1.start()



        def delete_content():
            self.app.after(0, self.label0.destroy)
            self.app.after(0,self.label1.destroy)
        def stop_run():
            self.flag=False
        self.bt = Button(self.app, text='开始抽奖', command=raffle, font=('黑体', 14), bg='white').pack()
        self.bt = Button(self.app, text='S T O P', command=stop_run, font=('黑体', 14), bg='white').pack()
        self.bt = Button(self.app, text='清除内容', command=delete_content, font=('黑体', 14), fg='red', bg='white',activebackground='red').pack()
if __name__ == '__main__':
    app = Tk()
    app.title('中国农业银行抽奖系统')
    app.config(bg="white")

    App = Application(app)
    app.geometry('800x600+300+150')  # 窗口大小设置
    app.mainloop()
相关推荐
爱喝白开水a1 小时前
LangChain 基础系列之 Prompt 工程详解:从设计原理到实战模板_langchain prompt
开发语言·数据库·人工智能·python·langchain·prompt·知识图谱
Neverfadeaway1 小时前
【C语言】深入理解函数指针数组应用(4)
c语言·开发语言·算法·回调函数·转移表·c语言实现计算器
武子康1 小时前
Java-152 深入浅出 MongoDB 索引详解 从 MongoDB B-树 到 MySQL B+树 索引机制、数据结构与应用场景的全面对比分析
java·开发语言·数据库·sql·mongodb·性能优化·nosql
杰克尼1 小时前
JavaWeb_p165部门管理
java·开发语言·前端
一成码农1 小时前
JavaSE面向对象(下)
java·开发语言
偶尔的鼠标人2 小时前
Avalonia DataGrid 控件的LostFocus事件会多次触发
开发语言·c#
晚风残2 小时前
【C++ Primer】第十二章:动态内存管理
开发语言·c++·c++ primer
_extraordinary_2 小时前
Java Spring日志
java·开发语言·spring
初圣魔门首席弟子2 小时前
【C++ 学习】单词统计器:从 “代码乱炖” 到 “清晰可品” 的复习笔记
开发语言·c++
默默coding的程序猿3 小时前
3.git的分支携带问题是什么?怎么解决?
java·git·python·svn·gitee·github·intellij-idea