您好,登錄后才能下訂單哦!
這篇文章主要介紹“Python怎么實現一個隨機抽獎小工具”,在日常操作中,相信很多人在Python怎么實現一個隨機抽獎小工具問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Python怎么實現一個隨機抽獎小工具”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!
先看效果:
針對隨機抽獎的小工具,需要可以導入參與抽獎的人員名單,然后選擇不同的獎勵類型進行隨機抽取獲獎名單并導出。
那么,簡單進行需求拆解,大致梳理出以下核心功能:
名單導入
為了避免出現重名情況,這里我們約定以下幾點:
①導入參與抽獎的人員名單文件(xlsx
類型文件)
②數據第一列為ID,第二列為name
參考格式案例
獎項類型選擇
獎項類型是指一等獎、二等獎這類標識語,這里我們內置了特等獎-六等獎共7個選項供選取
本輪人數
本輪人數是指每次抽獎時一次性抽取的獲獎人數,默認值為5
①當填入的數字超過剩余未獲獎人數時,會進行提示并顯示未獲獎人數
②當填入的數字為0表示輪空,也需要手動結束
③當填入的數字為負數時,點擊抽獎無響應
④當填入的非數字時,會進行提示需要輸入正確數字
抽獎時輪播區域
用于顯示抽獎中隨機滾動參與本輪抽獎的人員名單
人員名單
當選擇正確的人員名單文件后,這里會自動顯示人員信息列表
中獎記錄
記錄每次抽取的獎項類型及獲獎名單
開始抽獎
①開始抽獎時,會先判斷抽獎設置是否滿足條件,否則會有相關提示
②抽獎中點擊開始抽獎會提示正在抽獎中
結束
①非抽獎狀態下點擊結束無響應
②抽獎中點擊結束將顯示本次抽獎結果
重置
①重置會清掉歷史抽獎記錄(含本地文件,如有必要建議對中獎名單留檔)
②抽獎中點擊重置會提示正在抽獎中
③非抽獎狀態點擊重置會提示該操作會刪除歷史記錄,是否確認
基本功能點確認后,我們就開始進行GUI設計。
基于功能點,我們用axure
簡單進行UI布局設計
,然后再通過GUI
開發庫進行設計,這里依舊采用的是pysimplegui
,主要是簡單方便。
基于GUI設計,我們編碼如下:
nameList_column = [ [sg.Text("人員名單:")], [sg.Listbox(values=[], size=(20, 10), key="nameList")], ] result_column = [ [sg.Text("中獎記錄:")], [sg.Multiline("", size=(48, 10), key="result", text_color="DeepPink")], ] # 主題設置 sg.theme("SystemDefaultForReal") # 布局設置 layout = [[sg.Text("選擇參與抽獎人員名單文件:", font=("微軟雅黑", 12)), sg.InputText("", key="_file", size=(50, 1), font=("微軟雅黑", 10), enable_events=True), sg.FileBrowse("打開", file_types=(("Text Files", "*.xlsx"),), size=(10, 1), font=("微軟雅黑", 11))], [sg.Frame(layout=[ [sg.Text("本輪獎項:", font=("微軟雅黑", 12)), sg.Combo(["特等獎", "一等獎", "二等獎", "三等獎", "四等獎", "五等獎", "六等獎"], font=("微軟雅黑", 10), default_value="特等獎", size=(15, 5), key="_type"), sg.Text("本輪人數:", font=("微軟雅黑", 12)), sg.InputText("5", key="_num", size=(38, 1), font=("微軟雅黑", 10))], ], title="抽獎設置", title_color="red", relief=sg.RELIEF_SUNKEN, tooltip="請進行抽獎設置后再開始抽獎")], [sg.Multiline(size=(48, 5), font=( "微軟雅黑", 18), text_color="Blue", key="luckyName", justification="center")], [sg.Column(nameList_column), sg.Column(result_column)], [sg.Text("操作說明:", font=("微軟雅黑", 12))], [sg.Text("①先選擇參與抽獎的人員名單xlsx文件,人員名單文件包含ID和name兩個字段 ②獲獎名單將存在小工具所在文件夾,重置會刪除歷史記錄文件", font=("微軟雅黑", 10)), sg.Text("", font=("微軟雅黑", 12), size=(5, 1)), sg.Button("開始抽獎", font=("微軟雅黑", 12), button_color="Orange"), sg.Button("結束", font=("微軟雅黑", 12), button_color="red"), sg.Button("重置", font=("微軟雅黑", 12), button_color="red"), ], ] # 創建窗口 window = sg.Window("抽獎小工具,作者@微信公眾號:可以叫我才哥", layout, font=("微軟雅黑", 12), default_element_size=(50, 1))
其包含的控件如下:
Text 文本
InputText 輸入文本框
FileBrowse 文件瀏覽
Multiline 多行文本框
Combo 下拉框
Listbox 列表
Button 按鈕
需要注意的是這里有個Frame組件,用于layout嵌套,可以很好地模塊化UI布局。
在本案例中,需要實現三個功能,分別是:讀取人員名單、隨機抽獎以及保存中獎名單。
這里采用的是openpyxl
讀取表格數據并獲得某幾列的值,由于存在表頭,所以最后不需要表頭
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="提示",)
由于我們需要一次隨機抽取的人數存在多個,所以這里用的是random.sample()
,需要注意的是傳入的參數中names是需要去掉已中獎名單
def Result(window, names): global is_run, luckyNames _type = values["_type"] # 本輪獎項類型 _num = int(values["_num"]) # 本輪人數 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+" " window["result"].update(luckyNames) return time.sleep(0.088)
這里我們用的是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))
完成核心功能函數后,我們再進行GUI交互邏輯的實現。
這里有兩個全局變量,其中一個用于記錄當前抽獎狀態,另外一個用于存儲當前已經獲獎的人員信息。關于交互邏輯的詳情,大家可以結合核心功能需求及以下代碼了解。
# 初始狀態 is_run = False luckyNames = "" # 事件循環 while True: event, values = window.read() if event in (None, "關閉程序"): break if event == "_file": nameList(window) if event == "開始抽獎": if is_run: sg.popup("抽獎進行中,無需重復操作......", title="提示") continue try: names = nameList(window) # 人員名單 _num = int(values["_num"]) # 本輪人數 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"請選擇正確本輪抽獎人數(當前 {len(names_set)} 個未中獎人數)", title="提示") except: sg.popup("請選擇正確本輪抽獎人數(別超過總人數哦)", title="提示") elif event == "結束": is_run = False elif event == "重置": if is_run: sg.popup("抽獎進行中,請等待抽獎結束后重置...", title="提示") continue yes_no = sg.popup_yes_no( "重置會清楚歷史數據,是否執行此操作??", 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()
基于此,我們就完成了隨機抽獎小工具的制作。
啟動頁如下:
到此,關于“Python怎么實現一個隨機抽獎小工具”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。