如何解决为什么标签动画直到循环的最后一个值才起作用?
我是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 举报,一经查实,本站将立刻删除。