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 相关文章推荐
python实现定时播放mp3
Mar 29 Python
python交互式图形编程实例(三)
Nov 17 Python
Python抓取框架Scrapy爬虫入门:页面提取
Dec 01 Python
Python+matplotlib实现填充螺旋实例
Jan 15 Python
Python 查找字符在字符串中的位置实例
May 02 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
Python3.5 Pandas模块之Series用法实例分析
Apr 23 Python
ML神器:sklearn的快速使用及入门
Jul 11 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
浅谈Python3 numpy.ptp()最大值与最小值的差
Aug 24 Python
三个python爬虫项目实例代码
Dec 28 Python
Python测试线程应用程序过程解析
Dec 31 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
PHP入门学习笔记之一
2010/10/12 PHP
用php解析html的实现代码
2011/08/08 PHP
php 过滤英文标点符号及过滤中文标点符号代码
2014/06/12 PHP
php 调用ffmpeg获取视频信息的简单实现
2017/04/03 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
一个多次搜索+多次传值的解决方案
2007/01/20 Javascript
JAVASCRIPT keycode总结
2009/02/04 Javascript
ajax 同步请求和异步请求的差异分析
2011/07/04 Javascript
json格式的时间显示为正常年月日的方法
2013/09/08 Javascript
jquery与js函数冲突的两种解决方法
2013/09/09 Javascript
jQuery中:contains选择器用法实例
2014/12/30 Javascript
JavaScript实现点击自动选择TextArea文本的方法
2015/07/02 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
2016/07/19 Javascript
JS实现图片延迟加载并淡入淡出效果的简单方法
2016/08/25 Javascript
Bootstrap基本组件学习笔记之下拉菜单(7)
2016/12/07 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
jQuery实现验证码功能
2017/03/17 Javascript
jQuery常见面试题之DOM操作详析
2017/07/05 jQuery
解决vue接口数据赋值给data没有反应的问题
2018/08/27 Javascript
Vue.js结合bootstrap前端实现分页和排序效果
2018/12/29 Javascript
angular使用md5,CryptoJS des加密的方法
2019/06/03 Javascript
vue+高德地图实现地图搜索及点击定位操作
2020/09/09 Javascript
Vue常用API、高级API的相关总结
2021/02/02 Vue.js
Python 字符串转换为整形和浮点类型的方法
2018/07/17 Python
Python自动化导出zabbix数据并发邮件脚本
2019/08/16 Python
python Pillow图像处理方法汇总
2019/10/16 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
html5 桌面提醒:Notifycations应用介绍
2012/11/27 HTML / CSS
婚鞋、新娘鞋、礼服鞋、童鞋:Nina Shoes
2019/09/04 全球购物
文明倡议书范文
2014/04/15 职场文书
应届生求职信
2014/05/31 职场文书
12.4法制宣传日活动总结
2014/08/26 职场文书
2014小学数学教师个人工作总结
2014/12/18 职场文书
社区安置帮教工作总结2015
2015/05/20 职场文书
初中英语教学随笔
2015/08/15 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL