为什么标签动画直到循环的最后一个值才起作用?

如何解决为什么标签动画直到循环的最后一个值才起作用?

我是python的新手,最近我正在学习tkinter。因此,我自己想到,使用 grid_forget()函数,我可以删除一个小部件并重新定义它。我想到这个动画会更改标签的填充,以便创建空间(有点像移动标签但不完全一样)。但是,动画根本不起作用。程序冻结,直到标签达到填充的最后一个值。我怎样才能解决这个问题?还是有更好的方法来使屏幕上移动的标签动起来? 这是我的代码:

from tkinter import *
import time

root = Tk()
lbl = Label(root,text='------')
lbl.grid(row=0,column=0)


def animation():
    padding = 0
    while padding < 31:
        lbl.grid_forget()
        padding += 1
        lbl.grid(row=0,column=0,padx=padding)
        time.sleep(0.2)
        # alternative: root.after(200,lambda: lbl.grid(row=0,padx=padding))


btn = Button(root,text='Animate',command=animation)
btn.grid(row=1,column=1)
root.mainloop()

解决方法

您需要更新屏幕以显示更改。

以下是使用.update()方法的有效版本:

from tkinter import *
import time

root = Tk()
lbl = Label(root,text='------')
lbl.grid(row=0,column=0)


def animation():
    padding = 0
    while padding < 31:
        lbl.grid_forget()
        padding += 1
        lbl.grid(row=0,column=0,padx=padding)
        root.update()
        time.sleep(0.2)
        # alternative: root.after(200,lambda: lbl.grid(row=0,padx=padding))


btn = Button(root,text='Animate',command=animation)
btn.grid(row=1,column=1)
root.mainloop()
 
,

这是我还用来为屏幕上的内容制作动画的一种方法,我无法理解上面的代码段所要实现的目标,我尝试对其进行一些更改,但是我觉得这种方法要好得多让我们对窗口有更多的控制。

这使用了tkinter库中广泛使用的Canvas小部件。

Canvas是一个通用小部件,您可以将其用于很多事情。访问超级链接以获取更多清晰信息

这是您在屏幕上创建文本的简短示例。

from tkinter import *
root = Tk()

root.title("My animation")
c = Canvas(root)
x = 20 
y = 20    #Instead of using row and column,you simply use x and y co-ordinates
          #We will use these co-ordinates to show where the text is in the starting
my_text = c.create_text(x,y,text = '-----')
c.pack()

# This is all you need to create this text on your screen!
root.mainloop()

想法是,将画布放在窗口上,然后将任何放置在其上。

您可以添加更多属性来使文本看起来更好。 Here是有关它的深入教程。

现在我们已经制作了您的文本小部件,现在该移动它了。让我们将其从初始位置20,20移至90,20

这是我们将如何做的。如果我们简单地将文本对象移至90,90,我们将看不到任何动画,它将直接存在于其中。因此,我们要做的是首先在21,20创建它。然后22,20。等等...

我们做到这一点非常快,直到达到90,20

这似乎是我们在移动文本

from tkinter import *
import time
root = Tk()

root.title("My animation")
c = Canvas(root)
x = 20
y = 20    #Instead of using row and column,text = 'weee')
c.pack()

def animation():
    y = 0.1
    x = 0
    for _ in range(1000):
        c.move(my_text,x,y)
        root.update()


anlabel = Button(root,text = 'Animate!',command = animation).pack()

root.mainloop()


这不仅适用于文本,而且适用于画布上的所有内容(如其他图像)。画布上还有Events,可让您也使用鼠标单击和计算机上的其他键。

我已经对先前的代码进行了一些更改,但是它是可执行的,您可以自己尝试一下以了解其工作原理。增加time.sleep()中的值会使动画变慢,值越小越快。

,

确定要不要做以下示例所示的更多操作?对其中一个小部件上的填充进行动画处理会破坏其余的显示。

from tkinter import *
import time

root = Tk()
lbl = Label(root,text='')
lbl.grid(row=0,column=0)


def animation(step=12):
    step = 12 if step < 0 else step
    lbl['text'] = '      ------      '[step:step+6]
    root.after(200,lambda: animation(step-1))


Button(root,command=animation).grid(row=1,sticky='w')
root.mainloop()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)&gt; insert overwrite table dwd_trade_cart_add_inc &gt; select data.id, &gt; data.user_id, &gt; data.course_id, &gt; date_format(
错误1 hive (edu)&gt; insert into huanhuan values(1,&#39;haoge&#39;); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive&gt; show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 &lt;configuration&gt; &lt;property&gt; &lt;name&gt;yarn.nodemanager.res