用Python製作一個隨機抽獎小工具

来源:https://www.cnblogs.com/123456feng/archive/2022/04/15/16144615.html
-Advertisement-
Play Games

最近在工作中面向社群玩家組織了一場活動,需要進行隨機抽獎,參考之前小明大佬的案例,再結合自己的需求,做了一個簡單的隨機抽獎小工具。 今天我就來順便介紹一下這個小工具的製作過程吧! 1. 核心功能設計 針對隨機抽獎的小工具,需要可以導入參與抽獎的人員名單,然後選擇不同的獎勵類型進行隨機抽取獲獎名單並導 ...


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

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

在這裡插入圖片描述

1. 核心功能設計

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

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

•名單導入

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

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

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

參考格式案例

在這裡插入圖片描述

•獎項類型選擇

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

•本輪人數

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

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

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

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

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

•抽獎時輪播區域

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

•人員名單

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

•中獎記錄

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

•開始抽獎

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

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

•結束

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

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

•重置

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

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

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

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

在這裡插入圖片描述

2. GUI設計與實現

基於功能點,我們用axure簡單進行UI佈局設計,然後再通過GUI開發庫進行設計,這裡依舊採用的是pysimplegui,主要是簡單方

便。
在這裡插入圖片描述

Python學習交流Q群:906715085###
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讀取表格數據並獲得某幾列的值,由於存在表頭,所以最後不需要表頭

Python學習交流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. 隨機抽獎

由於我們需要一次隨機抽取的人數存在多個,所以這裡用的是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)
            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))

 

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

在這裡插入圖片描述

3.4. GUI交互邏輯

這裡有兩個全局變數,其中一個用於記錄當前抽獎狀態,另外一個用於存儲當前已經獲獎的人員信息。關於交互邏輯的詳情,大

家可以結合核心功能需求及以下代碼瞭解。

Python學習交流Q群:906715085###
# 初始狀態
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()

 

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

啟動頁如下:

在這裡插入圖片描述

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

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

在這裡插入圖片描述


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 老舊項目二次開髮指南 背景: 最近新入職公司,負責技術。由於各種原因現在項目全權交由我們團隊負責,之前的研發團隊不再參與(及以後可能完全聯繫不上)。作為技術負責人,又剛入職公司壓力巨大。經過兩個多月的改造,算是接手得還算行。該項目存在的問題比較典型,特此記錄。歡迎各位大佬批評指教。技術能力有限,文中 ...
  • Spring 最重要的方法refresh方法 根據上一篇文章 https://www.cnblogs.com/redwinter/p/16141285.html Spring Bean IOC 的創建流程繼續解讀Spring源碼,本篇文章解讀Spring 源碼最重要的方法refresh方法。 這個方 ...
  • 在python的輸出結果中,尤其是浮點數的輸出,當我們需要寫入文本文件時,最好是採用統一的輸出格式,這樣也能夠增強結果的可讀性。而對於浮點數輸出位數的控制,可以通過{:.4f}、%.4f來指定列印或者輸出時的字元串占據空間,也可以通過round函數來對輸出前的結果進行轉化。而如果是取有效數字,需要用... ...
  • 歷史(建議瞭解即可) 一、1990年,美國Sun公司的“Stealth計劃”(後改名為“Green計劃”)目標設置在家用電器等小型系統的程式語言,準備應用在電視機、電話、鬧鐘、烤麵包機等家用電器的控制和通信 二、1996年5月23日,JDK1.0開始發行(前期Java的版本只有兩個) 三、2005年 ...
  • 來源:zzzgd.blog.csdn.net/article/details/80627175 1. 前言 poi框架可以支持我們在java代碼中, 將數據導出成excel,但是實際開發中, 往往還需要設置excel字體,顏色,行高,列寬等屬性, 有時候還需要鎖住單元格, 防止別人講數據隨意篡改. ...
  • 一、源碼執行時的先後順序: 父類的靜態屬性和靜態塊(按照聲明順序) 本類的靜態屬性和靜態塊(按照聲明順序) main方法 父類的成員屬性和成員塊(按照聲明順序) 父類構造器 本類成員屬性和塊(按照聲明順序) 本類構造器 二、源碼執行需要註意: 在類載入的時候,靜態方法也已經載入了,但必須要通過類名或 ...
  • 前言 天氣預報我們每天都會關註,我們可以根據未來的天氣增減衣物、安排出行,每天的氣溫、風速風向、相對濕度、空氣質量等成 為關註的焦點。本次使用python中requests和BeautifulSoup庫對中國天氣網當天和未來14天的數據進行爬取,保存為csv文件,之 後用matplotlib、num ...
  • 大家平時都會用到哪些可視化的工具呢?Python中又有哪些好用的可視化模塊呢?今天就給大家分享一個Python小技能,小白也 能學會的可視化教程。 正 文 今天小編總結歸納了若幹個常用的可視化圖表,並且通過調用plotly、matplotlib、altair、bokeh和seaborn等模塊來分 別 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...