一、抽獎規則及使用方法
抽獎規則: 從1-138個號碼中隨機抽獎,共進行n輪抽獎,每個號碼僅有一次中獎機會,即已中獎的號碼不會再次中獎。
使用方法: 要求開始抽獎后屏幕上隨機滾動顯示中獎號碼,點擊“STOP”之后,滾動停止,此時所顯示的號碼為本輪中獎號碼;點擊“清空內容”后方可再次抽獎。
二、實現代碼
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=appself.application()self.n=0#執行次數self.flag=Truedef application(self):#農行logoself.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_poolnumber_pool=[i for i in range(1,139)]def raffle():self.flag=Trueif 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 += 1elif 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 += 1elif 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 += 1elif 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 += 1else:self.label0 = Label(self.app, text='本次抽獎結束。', font=('黑體', 20), bg='white')def printf(arr):#顯示中獎結果arr = pd.DataFrame(arr) # 將numpy.array轉換為pandas.dataframearr = arr.set_index(0) # 將第一列設置為行索引arr.index.name = None # 將行索引名稱設置為Nonearr = 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=Falseself.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()