Python使用Tkinter实现转盘抽奖器的步骤详解

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

Tkinter 实现滚动抽奖器参考:https://www.jb51.net/article/177913.htm

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

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

一、使用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 就可以完成设置。

random 模块使用参考: https://www.jb51.net/article/66368.htm

最后的抽奖器效果如下:

总结

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

(0)

相关推荐

  • Python Tkinter基础控件用法

    本文实例展示了Python Tkinter基础控件的用法,分享给大家供大家参考之用.具体方法如下: # -*- coding: utf-8 -*- from Tkinter import * def btn_click(): b2['text'] = 'clicked' evalue = e.get() print 'btn Click and Entry value is %s' % evalue def btn_click_bind(event): print 'enter b2' def

  • python实现大转盘抽奖效果

    本文实例为大家分享了python实现大转盘抽奖的具体代码,供大家参考,具体内容如下 选择转盘中的某一个方框,来进行抽奖 import tkinter #导入线程模块 import threading import time #导入代码的sleep 代码休眠 root = tkinter.Tk() root.title('大转盘') root.minsize(300,300) #摆放按钮 btn1 = tkinter.Button(root,text = '樱桃',bg = 'red') btn1

  • python的tkinter布局之简单的聊天窗口实现方法

    本文实例展示了一个python的tkinter布局的简单聊天窗口.分享给大家供大家参考之用.具体方法如下: 该实例展示的是一个简单的聊天窗口,可以实现下方输入聊天内容,点击发送,可以增加到上方聊天记录列表中.现在只是"单机"版. 右侧预留了空位可以放点儿其它东西.感兴趣的读者可以进一步做成socket双方互聊. 以下是功能代码部分: from Tkinter import * import datetime import time root = Tk() root.title(unic

  • python实现转盘效果 python实现轮盘抽奖游戏

    本文实例为大家分享了python实现转盘效果的具体代码,供大家参考,具体内容如下 #抽奖 面向对象版本 import tkinter import time import threading class choujiang: #初始化魔术方法 def __init__(self): #准备好界面 self.root = tkinter.Tk() self.root.title('lowB版转盘') self.root.minsize(300, 300) # 声明一个是否按下开始的变量 self.

  • Python Tkinter简单布局实例教程

    本文实例展示了Python Tkinter实现简单布局的方法,示例中备有较为详尽的注释,便于读者理解.分享给大家供大家参考之用.具体如下: # -*- coding: utf-8 -*- from Tkinter import * root = Tk() # 80x80代表了初始化时主窗口的大小,0,0代表了初始化时窗口所在的位置 root.geometry('80x80+10+10') # 填充方向 ''' Label(root, text = 'l1', bg = 'red').pack(f

  • Python升级提示Tkinter模块找不到的解决方法

    一.安装tkinter 在Linux中python默认是不安装Tkinter模块, 复制代码 代码如下: [root@li250-193 ~]# python Python 2.6.6 (r266:84292, Feb 22 2013, 00:00:18) [GCC 4.4.7 20120313 (Red Hat 4.4.7-3)] on linux2 Type "help", "copyright", "credits" or "li

  • Python使用Tkinter实现转盘抽奖器的步骤详解

    我使用 Python 中的 Tkinter 模块实现了一个简单的滚动抽奖器,接下来继续写一个简单的转盘抽奖器. Tkinter 实现滚动抽奖器参考:https://www.jb51.net/article/177913.htm 滚动抽奖器与点名的场景相似,是从一群人中抽出中奖的人,奖品是提前确定了的,抽奖只是确定中奖的人是谁.这种场景比较适合年会抽奖,奖品的种类和数量已经确定了,通过抽奖来抽出中奖人员,一个奖品对应一次抽奖,直到奖品抽完为止. 还有一种场景是只固定了奖品种类,数量不受限制,有参与

  • Python使用Tkinter实现滚动抽奖器效果

    年底,抽奖这个话题很多人都会讨论,都希望可以中奖. 接下来我就使用 Python 中的 Tkinter 模块来实现一个简单的滚动抽奖器. 一.Tkinter简介 Tkinter 是 Python 的标准 GUI(Graphical User Interface,图形用户接口)库,Python 使用 Tkinter 可以快速地创建 GUI 应用程序. 在 Python2 和 Python3 中,Tkinter 都在标准库中,无需安装即可使用.在 Python2 中,这个库叫 Tkinter ,在

  • 对Python中TKinter模块中的Label组件实例详解

    Python2.7.4 OS-W7x86 1. 简介 Label用于在指定的窗口中显示文本和图像.最终呈现出的Label是由背景和前景叠加构成的内容. Label组件定义函数:Label(master=None, cnf={}, **kw) 其中,kw参数是用来自定义lable组件的键值对. 2. 背景自定义 背景的话,有三部分构成:内容区+填充区+边框 <1>内容区参数有:width,length用于指定区域大小,如果显示前景内容是文本,则以单个字符大小为单位:如果显示的是图像,则以像素为单

  • Pycharm创建python文件自动添加日期作者等信息(步骤详解)

    第一步 找到 Preferences,点击进入.进入后找到 Editor – File and Code Templates – Python Script . 第二步 添加自己所需要的信息 第三步 添加完成后,点击 OK 键进行保存. 新建python文件就会看到已添加的默认信息. 常用配置 #-- coding: utf-8 -- #@Time : ${DATE} ${TIME} #@Author : XXXX #@Email : XXXX@qq.com #@File : ${NAME}.p

  • python在Windows下安装setuptools(easy_install工具)步骤详解

    本文讲述了python在Windows下安装setuptools(easy_install工具)的方法.分享给大家供大家参考,具体如下: [题外话介绍下setuptools] setuptools 是一组由PEAK(Python Enterprise Application Kit)开发的 Python 的 distutils 工具的增强工具,可以让程序员更方便的创建和发布 Python的egg 包,特别是那些对其它包具有依赖性的状况. 由 setuptools 创建和发布的包看起来和基于 di

  • 在springboot中使用拦截器的步骤详解

    目录 在springboot中使用拦截器 1. 定义拦截器 2. 使用JavaConfig注册拦截器 3. 定义控制器,测试拦截器 4. 总结 在springboot中使用拦截器 拦截器Interceptor,是SpringMVC中的核心内容,利用spring的AOP(Aspect Oriented Programming, 面向切面编程)特性,可以很方便的对用户的业务代码进行横向抽取,根据具体业务需求对应用功能进行增强.在SpringBoot中使用Interceptor,同时采用全注解开发,涉

  • 国产化之银河麒麟安装.NetCore包管理器方式(步骤详解)

    目录 背景 环境 安装步骤 1.更新软件列表 2.添加Microsoft包签名密钥到受信任包签名密钥列表 3.安装.netcore 3.1sdk 4.检查安装结果 测试 背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64.龙芯.飞腾.鲲鹏等. 考虑到这些基础产品对.NETCore的支持,最终选择了3.1版本.主要原因就是龙芯搞了自研CPU架构,用户量不够大,.NET官方并没有专门针对龙芯的支持,而龙芯团队只对.netcore3.1做

  • Python+Qt相片更换背景颜色窗体程序的步骤详解

    目录 前言 一.所需工具软件 1. Python3.6以上 2. Pycharm代码编辑器 3. PyQT, OpenCV库 二.使用步骤 1.引入库 2.导入相片 3.颜色选择: 4.运行结果如下: 三.在线协助: 程序示例精选 Python+Qt相片更换背景颜色窗体程序 如需安装运行环境或远程调试,由专业技术人员远程协助! 前言 QT+Python是非常经典的窗体编程组合,功能完善,可视化界面美观易维护,这篇博客针对相片更换背景颜色方面编写代码,代码整洁,规则,易读,对学习与使用Python

  • python装饰器实例大详解

    一.作用域 在python中,作用域分为两种:全局作用域和局部作用域. 全局作用域是定义在文件级别的变量,函数名.而局部作用域,则是定义函数内部. 关于作用域,我们要理解两点: a.在全局不能访问到局部定义的变量 b.在局部能够访问到全局定义的变量,但是不能修改全局定义的变量(当然有方法可以修改) 下面我们来看看下面实例: x = 1 def funx(): x = 10 print(x) # 打印出10 funx() print(x) # 打印出1 如果局部没有定义变量x,那么函数内部会从内往

  • Python 带有参数的装饰器实例代码详解

    demo.py(装饰器,带参数的装饰器): def set_level(level_num): def set_func(func): def call_func(*args, **kwargs): if level_num == 1: print("----权限级别1,验证----") elif level_num == 2: print("----权限级别2,验证----") return func() return call_func return set_f

随机推荐