返回顶部
首页 > 资讯 > 后端开发 > Python >Python制作一个随机抽奖小工具的实现
  • 630
分享到

Python制作一个随机抽奖小工具的实现

Python随机抽奖小工具Python随机抽奖 2022-06-02 22:06:07 630人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1. 核心功能设计2. GUI设计与实现3. 功能实现3.1 读取人员名单3.2. 随机抽奖3.3. 保存中奖名单3.4. GUI交互逻辑最近在工作中面向社群玩家组织了一场活动,需要进行随机抽奖,参考之前小明大佬

目录
  • 1. 核心功能设计
  • 2. GUI设计与实现
  • 3. 功能实现
    • 3.1 读取人员名单
    • 3.2. 随机抽奖
    • 3.3. 保存中奖名单
    • 3.4. GUI交互逻辑

最近在工作中面向社群玩家组织了一场活动,需要进行随机抽奖,参考之前小明大佬的案例,再结合自己的需求,做了一个简单的随机抽奖小工具

今天我就来顺便介绍一下这个小工具的制作过程吧!

先看效果:

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.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交互逻辑

这里有两个全局变量,其中一个用于记录当前抽奖状态,另外一个用于存储当前已经获奖的人员信息。关于交互逻辑的详情,大家可以结合核心功能需求及以下代码了解。


# 初始状态
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左右大小。

到此这篇关于python制作一个随机抽奖小工具的实现的文章就介绍到这了,更多相关Python 随机抽奖小工具内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python制作一个随机抽奖小工具的实现

本文链接: https://lsjlt.com/news/11099.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Python制作一个随机抽奖小工具的实现
    目录1. 核心功能设计2. GUI设计与实现3. 功能实现3.1 读取人员名单3.2. 随机抽奖3.3. 保存中奖名单3.4. GUI交互逻辑最近在工作中面向社群玩家组织了一场活动,需要进行随机抽奖,参考之前小明大佬...
    99+
    2022-06-02
    Python 随机抽奖小工具 Python 随机抽奖
  • JS实现随机抽奖小功能
    本文实例为大家分享了JS实现随机抽奖小功能的具体代码,供大家参考,具体内容如下 点击开始按钮开始抽奖,div依次变红!下面是js代码,需要的自取 <script>    ...
    99+
    2024-04-02
  • python随机抽奖系统怎么实现
    要实现一个Python随机抽奖系统,可以按照以下步骤进行:1. 导入random模块,用于生成随机数。```pythonimport...
    99+
    2023-08-16
    python
  • 用Python实现一个简单的抽奖小程序
    目录写在前面 实现结果 1 数据拉取2 数据清洗、去重3 中奖数据抽取python 相关知识点总结写在前面  因为粉丝福利,所以想自己写一个抽...
    99+
    2023-05-12
    python抽奖系统 python随机抽奖 python抽奖游戏
  • 利用Java实现一个双色球抽奖的随机算法
    今天就跟大家聊聊有关利用Java实现一个双色球抽奖的随机算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。原理如下:1首先初始化一个待抽奖的数组nums,数组的长度k 随机一个1-k...
    99+
    2023-05-31
    java 随机算法 ava
  • 基于vue3实现一个抽奖小项目
    目录前言数据保存姓名切换奖项切换历史记录数据导入结语前言 在公司年会期间我做了个抽奖小项目,我把它分享出来,有用得着的可以看下。浏览链接:http://xisite.top/orig...
    99+
    2023-01-28
    vue3抽奖项目 vue3抽奖
  • 教你用Python实现一个轮盘抽奖小游戏
    目录一、Python GUI 编程简介二、流行GUI框架总结三、代码演示四、界面一、Python GUI 编程简介 Tkinter 模块(Tk 接口)是 Python 的标准 Tk ...
    99+
    2024-04-02
  • 【Python系列】一个简单的抽奖小程序
    序言 很开心你能在万千博文中打开这一篇,希望能给你带来一定的帮助!👍🏻 如果有什么问题,都可以添加下方我的联系方式,联系我噢~😁 ⭐️⭐️⭐️⭐️⭐️沟通交流,一起成为技术达人!...
    99+
    2023-09-17
    python 开发语言
  • 基于Python制作一个文件去重小工具
    目录前言实现步骤补充前言 常常在下载网络素材时有很多的重复文件乱七八糟的,于是想实现一个去重的操作。 主要实现思路就是遍历出某个文件夹包括其子文件夹下面的所有文件,最后,将所有文件...
    99+
    2024-04-02
  • 怎么用Python制作一个文件去重小工具
    这篇文章主要讲解了“怎么用Python制作一个文件去重小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个文件去重小工具”吧!前言常常在下载网络素材时有很多的重复文...
    99+
    2023-06-29
  • Python利用PaddleOCR制作个搜题小工具
    目录介绍安装安装PaddlePaddle飞桨框架安装PaddleOCR代码使用搜题小工具安装ADB截图并保存题目区域图片OCR识别,获取题目打开浏览器搜索完整代码介绍 PaddleO...
    99+
    2024-04-02
  • 怎么用Python制作一个数据预处理小工具
    这篇文章主要讲解了“怎么用Python制作一个数据预处理小工具”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么用Python制作一个数据预处理小工具”吧!在我们平常使用Python进行数据...
    99+
    2023-06-15
  • python 制作一个gui界面的翻译工具
    目录一.准备工作二.预览1.主界面2.翻译3.支持多种语言哦三.源代码3.1 My_Translator-v2.0.py3.2 Translator.py四.总结一.准备工作 除了Tkinter,还需要google...
    99+
    2022-06-02
    python 翻译工具 python gui
  • [python小工具]实现屏幕录制
      用python实现屏幕录制 PIL 即pollow 的安装命令如下: pip install pillow 其中cv2的安装是下面这条命令 pip install opencv-python #python + opencv 实...
    99+
    2023-01-31
    小工具 屏幕 python
  • Python 实现一个颜色色值转换的小工具
      需求说明   公司的 UI 设计小哥,已经转用 Zeplin 很久了。Zeplin 的设计稿展示页面的颜色色值使用十进制的 RGB 表示的,在 Android 中的颜色表示大多情况下都需要十六进制的 R...
    99+
    2022-06-04
    小工具 颜色 Python
  • 基于Python制作一个多进制转换工具
    目录前言主要步骤完整代码前言 学习资料下载链接 提取码:9d4g  进制转换计算工具含源文件 主要步骤 导入模块 import tkinter from tki...
    99+
    2024-04-02
  • JavaScript实现一个Promise队列小工具
    目录摘要思考实现总结摘要 在百度的解释中,队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插...
    99+
    2024-04-02
  • 基于Python编写一个B站全自动抽奖的小程序
    目录导语开发工具环境搭建原理简介导语 应好友邀请,帮他写了个小程序,功能类似于实时监控自己关注的UP主,如果关注的UP主中有人发布了抽奖的动态,就自动参与这个抽奖。这样就能不错过任何...
    99+
    2024-04-02
  • Python如何利用PaddleOCR制作个搜题小工具
    这篇文章主要介绍“Python如何利用PaddleOCR制作个搜题小工具”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何利用PaddleOCR制作个搜题小工具”文章能帮助大家解决问题。...
    99+
    2023-07-02
  • 怎么使用Python和ChatGPT制作一个AI实用工具
    本篇内容介绍了“怎么使用Python和ChatGPT制作一个AI实用工具”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!注册OpenAI首先需...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作