最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python制作一個隨機(jī)抽獎小工具的實(shí)現(xiàn)

 更新時間:2021年07月07日 10:48:04   作者:可以叫我才哥  
最近在工作中面向社群玩家組織了一場活動,需要進(jìn)行隨機(jī)抽獎,就做了一個簡單的隨機(jī)抽獎小工具。具有一定的參考價值,感興趣的小伙伴們可以參考一下

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

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

先看效果:

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

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

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

名單導(dǎo)入

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

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

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

參考格式案例

案例

獎項(xiàng)類型選擇

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

本輪人數(shù)

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

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

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

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

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

抽獎時輪播區(qū)域

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

人員名單

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

中獎記錄

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

開始抽獎

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

②抽獎中點(diǎn)擊開始抽獎會提示正在抽獎中

結(jié)束

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

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

重置

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

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

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

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

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

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

UI布局設(shè)計-axure

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

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')],
]

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

# 布局設(shè)置
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('本輪獎項(xiàng):', font=('微軟雅黑', 12)), sg.Combo(['特等獎', '一等獎', '二等獎', '三等獎', '四等獎', '五等獎', '六等獎'], font=('微軟雅黑', 10), default_value='特等獎', size=(15, 5), key='_type'),
               sg.Text('本輪人數(shù):', font=('微軟雅黑', 12)), sg.InputText('5', key='_num', size=(38, 1), font=('微軟雅黑', 10))],
          ],
              title='抽獎設(shè)置', title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='請進(jìn)行抽獎設(shè)置后再開始抽獎')],
          [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('結(jié)束', font=('微軟雅黑', 12), button_color='red'),
           sg.Button('重置', font=('微軟雅黑', 12), button_color='red'), ],
          ]

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

其包含的控件如下:

  • Text 文本
  • InputText 輸入文本框
  • FileBrowse 文件瀏覽
  • Multiline 多行文本框
  • Combo 下拉框
  • Listbox 列表
  • Button 按鈕

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

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

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

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

3.2. 隨機(jī)抽獎

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

def Result(window, names):
    global is_run, luckyNames
    _type = values['_type']                # 本輪獎項(xiàng)類型
    _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 = ['獎項(xiàng)', '名單']
            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ù)后,我們再進(jìn)行GUI交互邏輯的實(shí)現(xiàn)。

3.4. GUI交互邏輯

這里有兩個全局變量,其中一個用于記錄當(dāng)前抽獎狀態(tài),另外一個用于存儲當(dāng)前已經(jī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 == '開始抽獎':
        if is_run:
            sg.popup('抽獎進(jìn)行中,無需重復(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('抽獎進(jìn)行中,請等待抽獎結(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()

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

啟動頁如下:

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

到此這篇關(guān)于Python制作一個隨機(jī)抽獎小工具的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)Python 隨機(jī)抽獎小工具內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 完美解決Django2.0中models下的ForeignKey()問題

    完美解決Django2.0中models下的ForeignKey()問題

    這篇文章主要介紹了完美解決Django2.0中models下的ForeignKey()問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • python妹子圖簡單爬蟲實(shí)例

    python妹子圖簡單爬蟲實(shí)例

    這篇文章主要介紹了python妹子圖簡單爬蟲,實(shí)例分析了Python爬蟲程序所涉及的頁面源碼獲取、進(jìn)度顯示、正則匹配等技巧,需要的朋友可以參考下
    2015-07-07
  • 使用Python編寫一個沙箱隔離功能

    使用Python編寫一個沙箱隔離功能

    這篇文章主要為大家詳細(xì)介紹了如何通過?Docker?實(shí)現(xiàn)一個簡單的沙箱隔離應(yīng)用,然后提供一個通過?Python?模擬沙箱的例子,感興趣的可以了解下
    2024-12-12
  • Python實(shí)現(xiàn)的從右到左字符串替換方法示例

    Python實(shí)現(xiàn)的從右到左字符串替換方法示例

    這篇文章主要介紹了Python實(shí)現(xiàn)的從右到左字符串替換方法,涉及Python字符串遍歷、運(yùn)算、判斷、替換等相關(guān)操作技巧,需要的朋友可以參考下
    2018-07-07
  • python操作鏈表的示例代碼

    python操作鏈表的示例代碼

    這篇文章主要介紹了python操作鏈表的示例代碼,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-09-09
  • 深入解析python返回函數(shù)和匿名函數(shù)

    深入解析python返回函數(shù)和匿名函數(shù)

    這篇文章主要介紹了python返回函數(shù)和匿名函數(shù)的相關(guān)知識,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-04-04
  • python基礎(chǔ)中的文件對象詳解

    python基礎(chǔ)中的文件對象詳解

    這篇文章主要為大家介紹了python基礎(chǔ)中的文件對象,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • Python數(shù)據(jù)分析之Matplotlib的常用操作總結(jié)

    Python數(shù)據(jù)分析之Matplotlib的常用操作總結(jié)

    Matplotlib是Python的繪圖庫,它可與NumPy一起使用,提供了一種有效的MatLab開源替代方案,下面這篇文章主要給大家介紹了關(guān)于Python數(shù)據(jù)分析之Matplotlib常用操作的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • 12個步驟教你理解Python裝飾器

    12個步驟教你理解Python裝飾器

    這篇文章主要介紹了12個步驟教你理解Python裝飾器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • pandas中Series和DataFrame的rank方法解析

    pandas中Series和DataFrame的rank方法解析

    pandas中的rank方法是用于數(shù)據(jù)排名的重要工具,它不返回排序后的數(shù)據(jù),而是數(shù)據(jù)的排名。rank方法可以處理相同數(shù)據(jù)的排名,通過平均排名方式解決排名沖突,并支持自定義排序規(guī)則及逆序排名。此外,DataFrame的rank方法允許在行或列上計算排名
    2024-09-09

最新評論

阿拉尔市| 丘北县| 高阳县| 巢湖市| 余庆县| 兴国县| 隆子县| 永丰县| 海宁市| 师宗县| 望都县| 根河市| 巴彦淖尔市| 巩义市| 乐业县| 昭平县| 博爱县| 和平县| 泰顺县| 尉氏县| 长治市| 甘泉县| 增城市| 漳浦县| 石楼县| 丹巴县| 镇江市| 阳春市| 黑河市| 思茅市| 乌海市| 邹城市| 南涧| 阳谷县| 阿尔山市| 庄河市| 全州县| 西畴县| 博乐市| 康保县| 句容市|