溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具

發(fā)布時(shí)間:2022-03-29 16:12:36 來(lái)源:億速云 閱讀:274 作者:iii 欄目:移動(dòng)開(kāi)發(fā)

這篇文章主要介紹“Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具”,在日常操作中,相信很多人在Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”P(pán)ython怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

先看效果:

Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具

1. 核心功能設(shè)計(jì)

針對(duì)隨機(jī)抽獎(jiǎng)的小工具,需要可以導(dǎo)入?yún)⑴c抽獎(jiǎng)的人員名單,然后選擇不同的獎(jiǎng)勵(lì)類(lèi)型進(jìn)行隨機(jī)抽取獲獎(jiǎng)名單并導(dǎo)出。

那么,簡(jiǎn)單進(jìn)行需求拆解,大致梳理出以下核心功能:

名單導(dǎo)入

為了避免出現(xiàn)重名情況,這里我們約定以下幾點(diǎn):

①導(dǎo)入?yún)⑴c抽獎(jiǎng)的人員名單文件(xlsx類(lèi)型文件)

②數(shù)據(jù)第一列為ID,第二列為name

參考格式案例

Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具

獎(jiǎng)項(xiàng)類(lèi)型選擇

獎(jiǎng)項(xiàng)類(lèi)型是指一等獎(jiǎng)、二等獎(jiǎng)這類(lèi)標(biāo)識(shí)語(yǔ),這里我們內(nèi)置了特等獎(jiǎng)-六等獎(jiǎng)共7個(gè)選項(xiàng)供選取

本輪人數(shù)

本輪人數(shù)是指每次抽獎(jiǎng)時(shí)一次性抽取的獲獎(jiǎng)人數(shù),默認(rèn)值為5

①當(dāng)填入的數(shù)字超過(guò)剩余未獲獎(jiǎng)人數(shù)時(shí),會(huì)進(jìn)行提示并顯示未獲獎(jiǎng)人數(shù)

②當(dāng)填入的數(shù)字為0表示輪空,也需要手動(dòng)結(jié)束

③當(dāng)填入的數(shù)字為負(fù)數(shù)時(shí),點(diǎn)擊抽獎(jiǎng)無(wú)響應(yīng)

④當(dāng)填入的非數(shù)字時(shí),會(huì)進(jìn)行提示需要輸入正確數(shù)字

抽獎(jiǎng)時(shí)輪播區(qū)域

用于顯示抽獎(jiǎng)中隨機(jī)滾動(dòng)參與本輪抽獎(jiǎng)的人員名單

人員名單

當(dāng)選擇正確的人員名單文件后,這里會(huì)自動(dòng)顯示人員信息列表

中獎(jiǎng)記錄

記錄每次抽取的獎(jiǎng)項(xiàng)類(lèi)型及獲獎(jiǎng)名單

開(kāi)始抽獎(jiǎng)

①開(kāi)始抽獎(jiǎng)時(shí),會(huì)先判斷抽獎(jiǎng)設(shè)置是否滿足條件,否則會(huì)有相關(guān)提示

②抽獎(jiǎng)中點(diǎn)擊開(kāi)始抽獎(jiǎng)會(huì)提示正在抽獎(jiǎng)中

結(jié)束

①非抽獎(jiǎng)狀態(tài)下點(diǎn)擊結(jié)束無(wú)響應(yīng)

②抽獎(jiǎng)中點(diǎn)擊結(jié)束將顯示本次抽獎(jiǎng)結(jié)果

重置

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

②抽獎(jiǎng)中點(diǎn)擊重置會(huì)提示正在抽獎(jiǎng)中

③非抽獎(jiǎng)狀態(tài)點(diǎn)擊重置會(huì)提示該操作會(huì)刪除歷史記錄,是否確認(rèn)

基本功能點(diǎn)確認(rèn)后,我們就開(kāi)始進(jìn)行GUI設(shè)計(jì)。

2. GUI設(shè)計(jì)與實(shí)現(xiàn)

基于功能點(diǎn),我們用axure簡(jiǎn)單進(jìn)行UI布局設(shè)計(jì),然后再通過(guò)GUI開(kāi)發(fā)庫(kù)進(jìn)行設(shè)計(jì),這里依舊采用的是pysimplegui,主要是簡(jiǎn)單方便。

Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具

基于GUI設(shè)計(jì),我們編碼如下:

nameList_column = [
    [sg.Text("人員名單:")],
    [sg.Listbox(values=[], size=(20, 10), key="nameList")],
]
result_column = [
    [sg.Text("中獎(jiǎng)記錄:")],
    [sg.Multiline("", size=(48, 10), key="result", text_color="DeepPink")],
]

# 主題設(shè)置
sg.theme("SystemDefaultForReal")

# 布局設(shè)置
layout = [[sg.Text("選擇參與抽獎(jiǎng)人員名單文件:", font=("微軟雅黑", 12)), sg.InputText("", key="_file", size=(50, 1), font=("微軟雅黑", 10), enable_events=True), sg.FileBrowse("打開(kāi)", file_types=(("Text Files", "*.xlsx"),), size=(10, 1), font=("微軟雅黑", 11))],
          [sg.Frame(layout=[
              [sg.Text("本輪獎(jiǎng)項(xiàng):", font=("微軟雅黑", 12)), sg.Combo(["特等獎(jiǎng)", "一等獎(jiǎng)", "二等獎(jiǎng)", "三等獎(jiǎng)", "四等獎(jiǎng)", "五等獎(jiǎng)", "六等獎(jiǎng)"], font=("微軟雅黑", 10), default_value="特等獎(jiǎng)", size=(15, 5), key="_type"),
               sg.Text("本輪人數(shù):", font=("微軟雅黑", 12)), sg.InputText("5", key="_num", size=(38, 1), font=("微軟雅黑", 10))],
          ],
              title="抽獎(jiǎng)設(shè)置", title_color="red", relief=sg.RELIEF_SUNKEN, tooltip="請(qǐng)進(jìn)行抽獎(jiǎng)設(shè)置后再開(kāi)始抽獎(jiǎng)")],
          [sg.Multiline(size=(48, 5), font=(
              "微軟雅黑", 18), text_color="Blue", key="luckyName", justification="center")],
          [sg.Column(nameList_column), sg.Column(result_column)],
          [sg.Text("操作說(shuō)明:", font=("微軟雅黑", 12))],
          [sg.Text("①先選擇參與抽獎(jiǎng)的人員名單xlsx文件,人員名單文件包含ID和name兩個(gè)字段
②獲獎(jiǎng)名單將存在小工具所在文件夾,重置會(huì)刪除歷史記錄文件", font=("微軟雅黑", 10)),
           sg.Text("", font=("微軟雅黑", 12), size=(5, 1)),
           sg.Button("開(kāi)始抽獎(jiǎng)", font=("微軟雅黑", 12), button_color="Orange"),
           sg.Button("結(jié)束", font=("微軟雅黑", 12), button_color="red"),
           sg.Button("重置", font=("微軟雅黑", 12), button_color="red"), ],
          ]

# 創(chuàng)建窗口
window = sg.Window("抽獎(jiǎng)小工具,作者@微信公眾號(hào):可以叫我才哥", layout,
                   font=("微軟雅黑", 12), default_element_size=(50, 1))

其包含的控件如下:

  • Text 文本

  • InputText 輸入文本框

  • FileBrowse 文件瀏覽

  • Multiline 多行文本框

  • Combo 下拉框

  • Listbox 列表

  • Button 按鈕

需要注意的是這里有個(gè)Frame組件,用于layout嵌套,可以很好地模塊化UI布局。

3. 功能實(shí)現(xiàn)

在本案例中,需要實(shí)現(xiàn)三個(gè)功能,分別是:讀取人員名單、隨機(jī)抽獎(jiǎng)以及保存中獎(jiǎng)名單。

3.1 讀取人員名單

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

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("請(qǐng)選擇正確格式的的人員名單文件", title="提示",)

3.2. 隨機(jī)抽獎(jiǎng)

由于我們需要一次隨機(jī)抽取的人數(shù)存在多個(gè),所以這里用的是random.sample(),需要注意的是傳入的參數(shù)中names是需要去掉已中獎(jiǎng)名單

def Result(window, names):
    global is_run, luckyNames
    _type = values["_type"]                # 本輪獎(jiǎng)項(xiàng)類(lèi)型
    _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 = ["獎(jiǎng)項(xiàng)", "名單"]
            toCsv(headers, [_type]*len(randomName), randomName, lucky)
            luckyNames = luckyNames + _type+" : "+luckyName+"

"
            window["result"].update(luckyNames)
            return
        time.sleep(0.088)

3.3. 保存中獎(jiǎng)名單

這里我們用的是csv庫(kù)的方法,追加存儲(chǔ)

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ù)后,我們?cè)龠M(jìn)行GUI交互邏輯的實(shí)現(xiàn)。

3.4. GUI交互邏輯

這里有兩個(gè)全局變量,其中一個(gè)用于記錄當(dāng)前抽獎(jiǎng)狀態(tài),另外一個(gè)用于存儲(chǔ)當(dāng)前已經(jīng)獲獎(jiǎng)的人員信息。關(guān)于交互邏輯的詳情,大家可以結(jié)合核心功能需求及以下代碼了解。

# 初始狀態(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 == "開(kāi)始抽獎(jiǎng)":
        if is_run:
            sg.popup("抽獎(jiǎng)進(jìn)行中,無(wú)需重復(fù)操作......", title="提示")
            continue
        try:
            names = nameList(window)               # 人員名單
            _num = int(values["_num"])             # 本輪人數(shù)
            lucky = "中獎(jiǎng)名單.csv"                 # 中獎(jiǎng)名單
            if os.path.exists(lucky):
                with open("中獎(jiǎng)名單.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"請(qǐng)選擇正確本輪抽獎(jiǎng)人數(shù)(當(dāng)前 {len(names_set)} 個(gè)未中獎(jiǎng)人數(shù))", title="提示")
        except:
            sg.popup("請(qǐng)選擇正確本輪抽獎(jiǎng)人數(shù)(別超過(guò)總?cè)藬?shù)哦)", title="提示")
    elif event == "結(jié)束":
        is_run = False
    elif event == "重置":
        if is_run:
            sg.popup("抽獎(jiǎng)進(jìn)行中,請(qǐng)等待抽獎(jiǎng)結(jié)束后重置...", title="提示")
            continue
        yes_no = sg.popup_yes_no(
            "重置會(huì)清楚歷史數(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("抽獎(jiǎng)歷史記錄已被重置......", title="提示")
            except:
                sg.popup("無(wú)抽獎(jiǎng)歷史記錄......", title="提示")
window.close()

基于此,我們就完成了隨機(jī)抽獎(jiǎng)小工具的制作。

啟動(dòng)頁(yè)如下:

Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具

到此,關(guān)于“Python怎么實(shí)現(xiàn)一個(gè)隨機(jī)抽獎(jiǎng)小工具”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI