日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

用Python制作一个随机抽奖小工具

發布時間:2023/12/19 python 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 用Python制作一个随机抽奖小工具 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在工作中面向社群玩家組織了一場活動,需要進行隨機抽獎,參考之前小明大佬的案例,再結合自己的需求,做了一個簡單的隨機抽獎小工具。

今天我就來順便介紹一下這個小工具的制作過程吧!

先看效果:

1. 核心功能設計

針對隨機抽獎的小工具,需要可以導入參與抽獎的人員名單,然后選擇不同的獎勵類型進行隨機抽取獲獎名單并導出。

那么,簡單進行需求拆解,大致梳理出以下核心功能:

  • 名單導入

為了避免出現重名情況,這里我們約定以下幾點:

①導入參與抽獎的人員名單文件(xlsx類型文件)

②數據第一列為ID,第二列為name

參考格式案例

案例
  • 獎項類型選擇

獎項類型是指一等獎、二等獎這類標識語,這里我們內置了特等獎-六等獎共7個選項供選取

  • 本輪人數

本輪人數是指每次抽獎時一次性抽取的獲獎人數,默認值為5

①當填入的數字超過剩余未獲獎人數時,會進行提示并顯示未獲獎人數

②當填入的數字為0表示輪空,也需要手動結束

③當填入的數字為負數時,點擊抽獎無響應

④當填入的非數字時,會進行提示需要輸入正確數字

  • 抽獎時輪播區域

用于顯示抽獎中隨機滾動參與本輪抽獎的人員名單

  • 人員名單

當選擇正確的人員名單文件后,這里會自動顯示人員信息列表

  • 中獎記錄

記錄每次抽取的獎項類型及獲獎名單

  • 開始抽獎

①開始抽獎時,會先判斷抽獎設置是否滿足條件,否則會有相關提示

②抽獎中點擊開始抽獎會提示正在抽獎中

  • 結束

①非抽獎狀態下點擊結束無響應

②抽獎中點擊結束將顯示本次抽獎結果

  • 重置

①重置會清掉歷史抽獎記錄(含本地文件,如有必要建議對中獎名單留檔)

②抽獎中點擊重置會提示正在抽獎中

③非抽獎狀態點擊重置會提示該操作會刪除歷史記錄,是否確認

基本功能點確認后,我們就開始進行GUI設計。

2. GUI設計與實現

基于功能點,我們用axure簡單進行UI布局設計,然后再通過GUI開發庫進行設計,這里依舊采用的是pysimplegui,主要是簡單方便。

UI布局設計-axure

基于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兩個字段\n②獲獎名單將存在小工具所在文件夾,重置會刪除歷史記錄文件',?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布局。

3. 功能實現

在本案例中,需要實現三個功能,分別是:讀取人員名單、隨機抽獎以及保存中獎名單。

3.1 讀取人員名單

這里采用的是openpyxl讀取表格數據并獲得某幾列的值,由于存在表頭,所以最后不需要表頭

def?nameList(window):fileName?=?values['_file']try:wb?=?openpyxl.load_workbook(fileName)active_sheet?=?wb.activenames?=?[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?namesexcept:sg.popup('請選擇正確格式的的人員名單文件',?title='提示',)

3.2. 隨機抽獎

由于我們需要一次隨機抽取的人數存在多個,所以這里用的是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+'\n\n'window['result'].update(luckyNames)returntime.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))

完成核心功能函數后,我們再進行GUI交互邏輯的實現。

3.4. GUI交互邏輯

這里有兩個全局變量,其中一個用于記錄當前抽獎狀態,另外一個用于存儲當前已經獲獎的人員信息。關于交互邏輯的詳情,大家可以結合核心功能需求及以下代碼了解。

#?初始狀態 is_run?=?False luckyNames?=?''#?事件循環 while?True:event,?values?=?window.read()if?event?in?(None,?'關閉程序'):breakif?event?==?'_file':nameList(window)if?event?==?'開始抽獎':if?is_run:sg.popup('抽獎進行中,無需重復操作......',?title='提示')continuetry: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)-selectedNameselse: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?=?Falseelif?event?==?'重置':if?is_run:sg.popup('抽獎進行中,請等待抽獎結束后重置...',?title='提示')continueyes_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()

基于此,我們就完成了隨機抽獎小工具的制作。

啟動頁如下:

最后,大家感興趣就可以將代碼打包成exe可執行文件了,我這邊打包下來大概10MB左右大小。

以上就是本文全部內容,如果你感興趣,點個贊和在看支持一下唄。

總結

以上是生活随笔為你收集整理的用Python制作一个随机抽奖小工具的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。