用Python制作一個隨機抽獎小工具 | 您所在的位置:網(wǎng)站首頁 › 屬鼠的與屬龍的相克嗎 › 用Python制作一個隨機抽獎小工具 |
最近在工作中面向社群玩家組織了一場活動,需要進行隨機抽獎,參考之前小明大佬的案例,再結(jié)合自己的需求,做了一個簡單的隨機抽獎小工具。 今天我就來順便介紹一下這個小工具的制作過程吧! 針對隨機抽獎的小工具,需要可以導(dǎo)入?yún)⑴c抽獎的人員名單,然后選擇不同的獎勵類型進行隨機抽取獲獎名單并導(dǎo)出。 那么,簡單進行需求拆解,大致梳理出以下核心功能: ?名單導(dǎo)入 為了避免出現(xiàn)重名情況,這里我們約定以下幾點: ①導(dǎo)入?yún)⑴c抽獎的人員名單文件(xlsx類型文件) ②數(shù)據(jù)第一列為ID,第二列為name 參考格式案例 ?獎項類型選擇 獎項類型是指一等獎、二等獎這類標(biāo)識語,這里我們內(nèi)置了特等獎-六等獎共7個選項供選取 ?本輪人數(shù) 本輪人數(shù)是指每次抽獎時一次性抽取的獲獎人數(shù),默認值為5 ①當(dāng)填入的數(shù)字超過剩余未獲獎人數(shù)時,會進行提示并顯示未獲獎人數(shù) ②當(dāng)填入的數(shù)字為0表示輪空,也需要手動結(jié)束 ③當(dāng)填入的數(shù)字為負數(shù)時,點擊抽獎無響應(yīng) ④當(dāng)填入的非數(shù)字時,會進行提示需要輸入正確數(shù)字 ?抽獎時輪播區(qū)域 用于顯示抽獎中隨機滾動參與本輪抽獎的人員名單 ?人員名單 當(dāng)選擇正確的人員名單文件后,這里會自動顯示人員信息列表 ?中獎記錄 記錄每次抽取的獎項類型及獲獎名單 ?開始抽獎 ①開始抽獎時,會先判斷抽獎設(shè)置是否滿足條件,否則會有相關(guān)提示 ②抽獎中點擊開始抽獎會提示正在抽獎中 ?結(jié)束 ①非抽獎狀態(tài)下點擊結(jié)束無響應(yīng) ②抽獎中點擊結(jié)束將顯示本次抽獎結(jié)果 ?重置 ①重置會清掉歷史抽獎記錄(含本地文件,如有必要建議對中獎名單留檔) ②抽獎中點擊重置會提示正在抽獎中 ③非抽獎狀態(tài)點擊重置會提示該作會刪除歷史記錄,是否確認 基本功能點確認后,我們就開始進行GUI設(shè)計。 基于功能點,我們用axure簡單進行UI布局設(shè)計,然后再通過GUI開發(fā)庫進行設(shè)計,這里依舊采用的是pysimplegui,主要是簡單方 便。 其包含的控件如下: ?Text 文本 ?InputText 輸入文本框 ?FileBrowse 文件瀏覽 ?Multiline 多行文本框 ?Combo 下拉框 ?Listbox 列表 ?Button 按鈕 需要注意的是這里有個Frame組件,用于layout嵌套,可以很好地模塊化UI布局。 在本案例中,需要實現(xiàn)三個功能,分別是:讀取人員名單、隨機抽獎以及保存中獎名單。 3.1 讀取人員名單這里采用的是openpyxl讀取表格數(shù)據(jù)并獲得某幾列的值,由于存在表頭,所以最后不需要表頭 Python學(xué)習(xí)交流Q群:906715085### def nameList(window): fileName = values['_file'] try: wb = openpyxl.load_workbook(fileName) active_sheet = wb.active names = [cell_object.value for cell_object in list(active_sheet.columns)[1]][1:] ids = [cell_object.value for cell_object in list(active_sheet.columns)[0]][1:] names = [name+'_'+str(id_) for name, id_ in zip(names, ids)] window['nameList'].update(names) return names except: sg.popup('請選擇正確格式的的人員名單文件', title='提示',) 3.2. 隨機抽獎由于我們需要一次隨機抽取的人數(shù)存在多個,所以這里用的是random.sample(),需要注意的是傳入的參數(shù)中names是需要去掉已 中獎名單 def Result(window, names): global is_run, luckyNames _type = values['_type'] # 本輪獎項類型 _num = int(values['_num']) # 本輪人數(shù) while True: randomName = random.sample(names, k=_num) luckyName = ' '.join(randomName) window['luckyName'].update(luckyName) if not is_run: headers = ['獎項', '名單'] toCsv(headers, [_type]*len(randomName), randomName, lucky) luckyNames = luckyNames + _type+' : '+luckyName+'\n\n' window['result'].update(luckyNames) return time.sleep(0.088) 3.3. 保存中獎名單這里我們用的是csv庫的方法,追加存儲 def toCsv(headers, col1, col2, file): # 存在則追加,不存在則新建 if os.path.exists(lucky): with open(lucky, 'a', encoding='utf_8_sig', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerows(zip(col1, col2)) else: with open(lucky, 'w', encoding='utf_8_sig', newline='') as csvfile: writer = csv.writer(csvfile) writer.writerow(headers) writer.writerows(zip(col1, col2))完成核心功能函數(shù)后,我們再進行GUI交互邏輯的實現(xiàn)。 這里有兩個全局變量,其中一個用于記錄當(dāng)前抽獎狀態(tài),另外一個用于存儲當(dāng)前已經(jīng)獲獎的人員信息。關(guān)于交互邏輯的詳情,大 家可以結(jié)合核心功能需求及以下代碼了解。 Python學(xué)習(xí)交流Q群:906715085### # 初始狀態(tài) is_run = False luckyNames = '' # 事件循環(huán) while True: event, values = window.read() if event in (None, '關(guān)閉程序'): break if event == '_file': nameList(window) if event == '開始抽獎': if is_run: sg.popup('抽獎進行中,無需重復(fù)作......', title='提示') continue try: names = nameList(window) # 人員名單 _num = int(values['_num']) # 本輪人數(shù) lucky = '中獎名單.csv' # 中獎名單 if os.path.exists(lucky): with open('中獎名單.csv', 'r', encoding='utf_8_sig') as f: reader = csv.reader(f) selectedNames = set([i[1] for i in reader][1:]) names_set = set(names)-selectedNames else: names_set = set(names) if len(names_set) >= _num: is_run = True _thread.start_new_thread(Result, (window, names_set)) else: sg.popup( f'請選擇正確本輪抽獎人數(shù)(當(dāng)前 {len(names_set)} 個未中獎人數(shù))', title='提示') except: sg.popup('請選擇正確本輪抽獎人數(shù)(別超過總?cè)藬?shù)哦)', title='提示') elif event == '結(jié)束': is_run = False elif event == '重置': if is_run: sg.popup('抽獎進行中,請等待抽獎結(jié)束后重置...', title='提示') continue yes_no = sg.popup_yes_no( '重置會清楚歷史數(shù)據(jù),是否執(zhí)行此作??', text_color='red', title='提示') if yes_no == 'Yes': try: os.remove(lucky) luckyNames = '' window['result'].update(luckyNames) window['luckyName'].update(luckyNames) sg.popup('抽獎歷史記錄已被重置......', title='提示') except: sg.popup('無抽獎歷史記錄......', title='提示') window.close()基于此,我們就完成了隨機抽獎小工具的制作。 啟動頁如下: 最后,大家感興趣就可以將代碼打包成exe可執(zhí)行文件了,我這邊打包下來大概10MB左右大小。 以上就是本文全部內(nèi)容,如果你感興趣,點個贊和在看支持一下唄。 |
今日新聞 |
推薦新聞 |
專題文章 |
CopyRight 2018-2019 實驗室設(shè)備網(wǎng) 版權(quán)所有 |