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


Posted in Python onJanuary 06, 2020

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

接下来我就使用 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 界面,效果如下图(参考)。

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

首先创建一个大小适合的窗口,使用 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-8
import sys
if sys.version_info[0] == 2:
  import Tkinter
  from Tkinter import *
else:
  import tkinter as Tkinter
  from tkinter import *
import random
data = ['风清扬', '无崖子', '东邪', '西毒', '南帝', '北丐']
going = True
is_run = False
def 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
    return
def 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 = False
if __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使用Tkinter实现滚动抽奖器效果,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
解决python3 urllib中urlopen报错的问题
Mar 25 Python
python中defaultdict的用法详解
Jun 07 Python
Python绘制七段数码管实例代码
Dec 20 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
django session完成状态保持的方法
Nov 27 Python
Django后台admin的使用详解
Jul 08 Python
python批量将excel内容进行翻译写入功能
Oct 10 Python
Python通过递归获取目录下指定文件代码实例
Nov 07 Python
django中的数据库迁移的实现
Mar 16 Python
Python实现ElGamal加密算法的示例代码
Jun 19 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
python使用torch随机初始化参数
Mar 22 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 #Python
pytorch 实现在预训练模型的 input上增减通道
Jan 06 #Python
Python 将json序列化后的字符串转换成字典(推荐)
Jan 06 #Python
Python tkinter三种布局实例详解
Jan 06 #Python
Python有参函数使用代码实例
Jan 06 #Python
python通过移动端访问查看电脑界面
Jan 06 #Python
基于pytorch 预训练的词向量用法详解
Jan 06 #Python
You might like
注意:php5.4删除了session_unregister函数
2013/08/05 PHP
JavaScript与HTML结合的基本使用方法整理
2015/10/12 PHP
yii2使用GridView实现数据全选及批量删除按钮示例
2017/03/01 PHP
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
Kindeditor在线文本编辑器如何过滤HTML
2016/04/14 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
在一个页面重复使用一个js函数的方法详解
2016/12/26 Javascript
js/jquery控制页面动态加载数据 滑动滚动条自动加载事件的方法
2017/02/08 Javascript
jquery ajax加载数据前台渲染方式 不用for遍历的方法
2018/08/09 jQuery
Vue-CLI 3.X 部署项目至生产服务器的方法
2019/03/22 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
微信小程序实现弹出菜单动画
2019/06/21 Javascript
基于layui框架响应式布局的一些使用详解
2019/09/16 Javascript
uniapp与webview之间的相互传值的实现
2020/06/29 Javascript
[02:23]2014DOTA2国际邀请赛中国战队回顾
2014/08/01 DOTA
[02:38]DOTA2 夜魇暗潮2020活动介绍官方视频
2020/11/04 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
Python实现简单截取中文字符串的方法
2015/06/15 Python
基于Python实现通过微信搜索功能查看谁把你删除了
2016/01/27 Python
Python数据分析之双色球统计单个红和蓝球哪个比例高的方法
2018/02/03 Python
django启动uwsgi报错的解决方法
2018/04/08 Python
PyQt5每天必学之像素图控件QPixmap
2018/04/19 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
python中自带的三个装饰器的实现
2019/11/08 Python
dpn网络的pytorch实现方式
2020/01/14 Python
AHAVA美国官方网站:死海海泥护肤品牌
2016/10/18 全球购物
巴西图书和电子产品购物网站:Saraiva
2017/06/07 全球购物
欧洲最古老的鞋厂:Peter Kaiser
2019/11/05 全球购物
初中同学聚会感言
2014/02/11 职场文书
大学优秀班集体申报材料
2014/05/23 职场文书
计算机多媒体专业自荐信
2014/07/04 职场文书
2014年平安夜寄语
2014/12/08 职场文书
《帝国时代4》赛季预告 新增内容编译器可创造地图
2022/04/03 其他游戏
微前端qiankun改造日渐庞大的项目教程
2022/06/21 Javascript