侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

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

Python  /  管理员 发布于 7年前   159

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

Tkinter 实现滚动抽奖器参考:https:///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-8import sysif 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:///article/66368.htm

最后的抽奖器效果如下:

总结

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


  • 上一条:
    Python使用Tkinter实现滚动抽奖器效果
    下一条:
    Python 将json序列化后的字符串转换成字典(推荐)
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客