一、抽奖规则及使用方法
抽奖规则: 从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()