Python使用Tkinter实现滚动抽奖器效果
作者:Python碎片 发布时间:2023-04-07 03:05:45
年底,抽奖这个话题很多人都会讨论,都希望可以中奖。
接下来我就使用 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-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实现滚动抽奖器效果网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
来源:https://blog.csdn.net/weixin_43790276/article/details/103811660


猜你喜欢
- 上篇文章给大家介绍过解决Navicat for Mysql连接报错1251的问题(连接失败),今天介绍Navicat for MySQL 连
- <form id="myForm" method="post">
- 前些日子在做绩效体系的时候,遇到了一件囧事,居然忘记怎样在Excel上拟合正态分布了,尽管在第二天重新拾起了Excel中那几个常见的函数和图
- 我确定有很多关于Unicode和Python的说明,但为了方便自己的理解使用,我还是打算再写一些关于它们的东西。 字节流 vs U
- 本文为大家分享了mysql 5.7.18 Archive压缩版安装的具体方法,供大家参考,具体内容如下文章参考:5.7.17 winx64安
- 学习目标:对二值图进行分析,设定最大最小面积区间保留该面积区间内的区域示例代码//src为二值图,minArea、maxArea为面积阈值,
- 此文刊登在《程序员》三月期,有删改提到安全问题,首先想到应付这些问题的应该是系统管理员以及后台开发工程师们,而前端开发工程师似乎离这些问题很
- 好多网友问起来,·深度学习网址导航·深度学习整站系统 的后台管理能否增加批量删除功能,如何加:就是列出N篇文章或网址信息,每篇文章或网址前有
- 有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用Python也可以
- 主要是运用java.util.regex类。 import java.util.regex.Matcher;import java
- 前言:Python pass 是空语句,是为了保持程序结构的完整性;pass 不做任何事情,一般用做占位语句。Python 语言
- 实现效果完整代码+详细注释<template> <div class="echart"&g
- Mysqli是php5之后才有的功能,没有开启扩展的朋友可以打开您的php.ini的配置文件。 查找下面的语句:;extension=php
- 应用目标:制作文字特效 应用软件:Dreamweaver MX操作难度:★★☆☆☆我们常用的网页制作工具Dreamweaver MX不仅可以
- 本文实例讲述了Python求一批字符串的最长公共前缀算法。分享给大家供大家参考,具体如下:思路一:这个题一拿到手,第一反应就是以第一个字符串
- 虚继承 的概念的提出主要是为了解决C++多继承的问题,举个最简单的例子:class animal{ &nb
- 在本地windows机器开发的Django项目运行正常,放到服务器上后响应超慢,花了一整个工作日没找到原因(非常绝望),又花了一整个周末才找
- 错误截图如下:类似报错的原因1.imread()中的路径参数有误a.相对路径:此项目文件夹下可写成imread(“1.jpg”);b.绝对路
- 安装pyqt5wind@wind-ThinkPad-X250:~/Downloads/PyQt5_gpl-5.12.2$ python3 -
- 数据聚合与分组运算对数据集进行分组并对各组应用一个函数(无论是聚合还是转换),通常是数据分析工作中的重要环节。在将数据集加载、融合、准备好之