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

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

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

年底,抽奖这个话题很多人都会讨论,都希望可以中奖。

接下来我就使用 Python 中的 Tkinter 模块来实现一个简单的滚动抽奖器。

一、Tkinter简介

Tkinter 是 Python 的标准 GUI(Graphical User Interface,图形用户接口)库,Python 使用 Tkinter 可以快速地创建 GUI 应用程序。

在 Python2 和 Python3 中,Tkinter 都在标准库中,无需安装即可使用。在 Python2 中,这个库叫 Tkinter ,在 Python3 中,这个库叫 tkinter ,首字母大小写不相同,在导包时需要注意。

虽然 Python 的官网已经宣布,2020年4月,Python2 会退休,但是在很多公司,依然在使用 Python2 ,所以本文的代码也会兼容 Python2 和 Python3 。

Tkinter 提供了非常丰富的图形界面功能,实现一个抽奖器,只需要用到里面很少的一部分功能。

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

1. 界面搭建

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

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

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

2. 设置文字显示框

抽奖时,要在界面上快速地滚动显示当前的中奖者姓名,所以要设置一个文字显示框。

使用 Tkinter 中的 Label 类(不一定用 Label ,实现方法有很多),实例化 Label 的对象来显示文字,充当显示框。Label 标签默认不可点击不可选中也不可编辑,用来显示比较少的内容(人名)是比较适合的。

要设置 Label 显示的文字,需要实例化一个 StringVar 类的对象,使用 StringVar 中的 value 传入初始显示的内容。在 Label 中 将 StringVar 对象传给 textvariable ,这样 Label 和 StringVar 就一一对应起来了。

实例化 Label 时,第一个参数必须是 Tkinter 窗口对象 window,然后使用关键字参数的方式,根据需要设置显示框大小,背景颜色,显示字体等,再通过 Label 对象的 place() 方法设置它相对于窗口左上角的位置。

需要多个 Label 时,如法炮制。

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 randomdata = ['风清扬', '无崖子', '东邪', '西毒', '南帝', '北丐']going = Trueis_run = Falsedef lottery_roll(var1, var2):  global going  show_member = random.choice(data)  var1.set(show_member)  if going:    window.after(50, lottery_roll, var1, var2)  else:    var2.set('恭喜 {} !!!'.format(show_member))    going = True    returndef lottery_start(var1, var2):  global is_run  if is_run:    return  is_run = True  var2.set('幸运儿是你吗。。。')  lottery_roll(var1, var2)def lottery_end():  global going, is_run  if is_run:    going = False    is_run = Falseif __name__ == '__main__':  window = Tkinter.Tk()  window.geometry('405x320+250+15')  window.title('   滚 动 抽 奖 器')  bg_label = Label(window, width=70, height=24, bg='#ECf5FF')  bg_label.place(anchor=NW, x=0, y=0)  var1 = StringVar(value='即 将 开 始')  show_label1 = Label(window, textvariable=var1, justify='left', anchor=CENTER, width=17, height=3, bg='#BFEFFF',font='楷体 -40 bold', foreground='black')  show_label1.place(anchor=NW, x=21, y=20)  var2 = StringVar(value='幸运儿是你吗。。。')  show_label2 = Label(window, textvariable=var2, justify='left', anchor=CENTER, width=38, height=3, bg='#ECf5FF',font='楷体 -18 bold', foreground='red')  show_label2.place(anchor=NW, x=21, y=240)  button1 = Button(window, text='开始', command=lambda: lottery_start(var1, var2), width=14, height=2, bg='#A8A8A8',           font='宋体 -18 bold')  button1.place(anchor=NW, x=20, y=175)  button2 = Button(window, text='结束', command=lambda: lottery_end(), width=14, height=2, bg='#A8A8A8',           font='宋体 -18 bold')  button2.place(anchor=NW, x=232, y=175)  window.mainloop()

代码中主要是按照创建窗口,创建显示框,创建按钮,编写抽奖函数等步骤来实现。

有一个点需要注意一下,当第一次抽奖还没有(点击)结束时,如果点了第二次(或很多次)抽奖,会有多次抽奖并行运行,点结束时,无法使抽奖器正常结束,甚至造成程序出错。所以在代码中设置了两个全局变量 going 和 is_run,分别表示是否可以继续滚动(递归)显示下一个名额和当前抽奖器是否在运行,通过它们控制同时只有一次抽奖在运行。

最后的抽奖器效果如下:

这个程序可以用于抽奖,还可以用于点名等,不同使用场景只需要简单修改就可以了。

总结

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


  • 上一条:
    基于python+selenium的二次封装的实现
    下一条:
    Python使用Tkinter实现转盘抽奖器的步骤详解
  • 昵称:

    邮箱:

    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交流群

    侯体宗的博客