我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器。

滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中奖的人是谁。这种场景比较适合年会抽奖,奖品的种类和数量已经确定了,通过抽奖来抽出中奖人员,一个奖品对应一次抽奖,直到奖品抽完为止。

还有一种场景是只固定了奖品种类,数量不受限制,有参与资格的人都可以抽奖,可能所有人都抽中了“特等奖”,也可能所有人都抽到了“谢谢参与”,最终发出多少奖品在抽奖前没法确定。这种场景比较适合使用“大转盘”抽奖器。

一、使用Tkinter实现滚动抽奖器的步骤

1. 界面搭建

首先需要搭建一个简单的 GUI 界面,效果如下图(参考)。

首先创建一个大小适合的窗口,使用 Tkinter.Tk() 方法创建并返回一个窗口对象 window 。

使用 window 对象的 geometry(widthxheight+x+y) 方法设置窗口的大小,geometry() 方法中的参数格式为 widthxheight+x+y,如 '500x290+250+150',width 是窗口的宽度,height 是窗口的高度,中间使用乘号连接,如果敲不出这个符号,可以去源码中复制,x 和 y 用于设置窗口离电脑屏幕左上角的距离。

2. 设置转盘的内容

使用转盘抽奖时,点击开始后,转到不同方向对应不同的奖品种类,所以要设置每个方向显示不同的内容。

使用 Tkinter 中的 Label 类,实例化 Label 的对象来显示文字。

实例化 Label 时,第一个参数必须是 Tkinter 窗口对象 window,然后通过 text 设置显示的内容。每个 Label 显示的内容都是固定不变的,所以可以一开始就写死。然后使用关键字参数的方式,根据需要设置显示框大小,背景颜色,显示字体等,再通过 Label 对象的 place() 方法设置它相对于窗口左上角的位置。

在这个转盘抽奖器中,我分了8个不同的方向,8个区域,所以需要8个 Label 。在这8个标签中,除了显示的内容和位置不一样,其他的设置都是一样的,所以将添加标签的步骤封装成一个函数,创建标签时更方便。

3. 设置开始按钮

在界面中,需要一个“开始”按钮,用来开始抽奖。转盘抽奖是点击开始后,抽奖界面开始转动,速度由快到慢,直到自动停止,最后停止的区域就是中奖的区域,所以不用“停止”按钮。

使用 Tkinter 中的 Button 类,实例化 Button 的对象来创建“开始”按钮。

实例化 Button 时,第一个参数也必须是 Tkinter 窗口对象 window,然后根据需要设置按钮大小,背景颜色,显示字体等,最后还是使用 place() 方法设置它相对于的窗口左上角的位置。

当点击按钮时,开始抽奖,定义好处理抽奖逻辑的函数,用匿名函数的方式传给 Button 中的 command ,将点击按钮和抽奖逻辑处理函数关联到一起。

二、抽奖器代码实现和效果展示

按照上面分析的步骤依次实现,完整代码如下。

# coding=utf-8

import sys

if sys.version_info[0] == 2:

import Tkinter

from Tkinter import *

else:

import tkinter as Tkinter

from tkinter import *

import random

is_run = False

def lottery_whirl(data, i, number):

global is_run

if i == 0:

j = 0

else:

j = i % 8

data[j-1]['bg'] = '#CCCCCC'

data[j]['bg'] = '#00CD00'

wait = [a for a in range(100, 300, 10)] + [b for b in range(300, 600, 300 // (number-28))] + \

[c for c in range(600, 1200, 120)] + [d for d in range(1200, 1800, 200)]

if i < number:

window.after(wait[i], lottery_whirl, data, i + 1, number)

else:

is_run = False

def lottery_start(data):

global is_run

if is_run:

return

is_run = True

for x in range(len(data) - 1):

data[x]['bg'] = '#CCCCCC'

number = random.randint(30, 53)

lottery_whirl(data, 0, number)

def create_label(name, x, y):

label = Label(window, text=name, width=13, height=3, bg='#CCCCCC', font='宋体 -18 bold')

label.place(anchor=NW, x=x, y=y)

return label

if __name__ == '__main__':

window = Tkinter.Tk()

window.geometry('500x290+250+150')

window.title(' 转 盘 抽 奖 器')

bg_label = Label(window, width=80, height=24, bg='#ECf5FF')

bg_label.place(anchor=NW, x=0, y=0)

label1 = create_label('风清扬', 20, 20)

label2 = create_label('北丐', 180, 20)

label3 = create_label('无崖子', 340, 20)

label4 = create_label('西毒', 20, 110)

label5 = create_label('东邪', 340, 110)

label6 = create_label('扫地僧', 20, 200)

label7 = create_label('南帝', 180, 200)

label8 = create_label('张三丰', 340, 200)

data = [label1, label2, label3, label5, label8, label7, label6, label4]

button_core = Button(window, text='开 始', command=lambda: lottery_start(data), width=130, height=53, bg='#00CD00',

font='宋体 -18 bold', bitmap='gray50', compound=Tkinter.CENTER)

button_core.place(anchor=NW, x=180, y=110)

window.mainloop()

当点击开始抽奖后,抽奖界面开始转动,直到自动停止才算一次抽奖结束。如果第一次抽奖还没有结束,点了第二次(或很多次)抽奖,会有多次抽奖并行运行,那样会有很多次转动重叠到一起,相互干扰,抽奖器就失效了。所以在代码中设置了一个全局变量 is_run,表示抽奖器是否还在运行中,如果还在运行中,就不会进行下一次抽奖。

在抽奖器转动时,速度是由快变慢的,所以设置了一个列表来控制转动的延迟时间,这个时间列表可以分多段,每一段可以是等差数列,不过差值设置越来越大。

点击开始按钮,开始转动时,代码中已经确定了转到哪个位置(中奖类型),转到哪个位置是由转动的次数决定的,转动次数也是从一个列表中取。转盘抽奖不会设置停在每个区域的概率都一样(那样意味着每种奖的中奖概率相同),所以,从列表中取转动次数时,先根据需要设置好概率的大小,使用 random 模块中的 choices 就可以完成设置。

最后的抽奖器效果如下:

总结

以上所述是小编给大家介绍的Python使用Tkinter实现滚动转盘抽奖器的步骤详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

python抽奖滚动界面_Python使用Tkinter实现转盘抽奖器的步骤详解相关推荐

  1. python转盘抽奖_Python使用Tkinter实现转盘抽奖器的步骤详解

    我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器. 滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中 ...

  2. python 录制web视频_Python django框架 web端视频加密的实例详解

    视频加密流程图: 后端获取保利威的视频播放授权token,提供接口api给前端 参考文档:http://dev.polyv.net/2019/videoproduct/v-api/v-api-play ...

  3. python类的命名空间_Python之关于类变量的两种赋值区别详解

    我就废话不多说了,还是直接看代码吧! # -*- coding:utf-8 -*- #面试题,写一个方法,将一行字符串中所有的单词数量统计出来 class Person(object): TAG = ...

  4. python模拟手写笔迹_Python实现基于KNN算法的笔迹识别功能详解

    本文实例讲述了Python实现基于KNN算法的笔迹识别功能.分享给大家供大家参考,具体如下: 需要用到: Numpy库 Pandas库 手写识别数据 点击此处本站下载. 数据说明: 数据共有785列, ...

  5. python中英文字频率_python实现统计文本中单词出现的频率详解

    本文实例为大家分享了python统计文本中单词出现频率的具体代码,供大家参考,具体内容如下 #coding=utf-8 import os from collections import Counte ...

  6. python进程socket通信_Python Socket TCP双端聊天功能实现过程详解

    SOCKET编程 socket(套接字):是一个网络通信的端点,能实现不同主机的进程通信, -通过IP+端口定位对方并发送消息的通信机制 分为UDP和TCP 客户端Client: 发起访问的一-方 服 ...

  7. python北京时间代码_python代码定时同步本机的北京时间详解

    这段python代码首先从www.beijing-time.org上获取标准的北京时间,然后同步获取的北京时间到本地 # -*- coding: utf-8 -*- import time,httpl ...

  8. python列表浅复制_Python列表的深复制和浅复制示例详解

    一.深复制与浅复制 列表是Python中自带的一种数据结构,在使用列表时,拷贝操作不可避免,下面简单讨论一下列表的深复制(拷贝)与浅复制 首先看代码: l1 = [5, 4, 3, 2, 1] # 用 ...

  9. python如何定义类_Python中类的定义、继承及使用对象实例详解

    本文实例讲述了Python中类的定义.继承及使用对象的方法.分享给大家供大家参考.具体分析如下: Python编程中类的概念可以比作是某种类型集合的描述,如"人类"可以被看作一个类 ...

最新文章

  1. 解决 apache 2.4.1 无法解析shtml中的expr指令问题
  2. 【算法总结】数学问题-最大公约数和最小公倍数
  3. python中什么是匿名函数_python中的匿名函数
  4. python学起来难吗-python学起来难吗
  5. 在php中插入数据显示在html_PHP中的浮点型数据计算之程序员脱发问题
  6. 整合Hibernate3.x
  7. 基于Web的浮动图片墙
  8. CentOS 关闭蜂鸣器声音
  9. Linux通过源码编译安装程序;yum和源码安转软件包的区别
  10. perl 语言(数组)
  11. 【渝粤题库】陕西师范大学163215旅游研究方法与论文写作 作业(专升本)
  12. 使用动态时间规整来同步时间序列数据
  13. cacti监控部署——网络流量监控
  14. 关于mysql的时区(下):如何设置mysql的时区
  15. 76----平面二次曲线的分类: 消去二次交叉项
  16. IsFinite (m_CachedRange.first) IsFinite (m_CachedRange.second) 的解决参考
  17. 苹果手机的uuid查询_苹果Mac查询UUID信息, 硬盘接口类型的查询方法(图文)
  18. Springboot @Value读取map或list的properties配置
  19. .sh文件规则 .sh文件执行方法
  20. [CNNA] 路由器基础

热门文章

  1. Tensorflow--图
  2. python django前端重构_django修改models重建数据库的操作
  3. python格式化输出宽度对齐_python 中 字符串格式化示例,输出格式没有达到指定宽度,求帮忙!...
  4. 12C 新特性 | 标量子查询自动转换
  5. 【华为云技术分享】GitHub联合开发
  6. TikZ绘图示例——尺规作图: 圆内接正七边形的近似画法
  7. vim插件管理器minpac安装及使用
  8. 深度学习经典算法 | 蚁群算法解析
  9. kinect内参数的标定
  10. C++命名空间的三种使用方法