for plusOneFrames in range(0, 25):
xxUL = xxUL + 0
yyUL = yyUL - 5
myText = screen.create_text( xxUL, yyUL, text = "+1", font = "Arial 25", fill = "black" )
screen.update()
sleep(0.05)
screen.delete( myText )
screen.delete( myText )
所以基本上,每当用户点击时它会使+1浮动,但每当有人上升并再次点击时,已经上升的+1就会停在它的位置而只是坐在那里。如果我再次点击它会做同样的事情直到数百个。我怎样才能使它永远不会停止动画,即使它是一个for for循环?
答案 0 :(得分:1)
如果不使整个程序停止运行,则不能在Tkinter回调中使用sleep
。毕竟,这正是sleep(0.05)
的意思:让整个程序停止运行0.05秒。
它不仅仅是sleep
- 无论这个功能是什么,在它运行的时候,那就是正在运行的代码;没有其他代码可以运行,因此您的UI会被冻结。
有两种基本解决方案:
第二个可能看起来更简单,但不幸的是Tkinter在多线程应用程序中使用起来很痛苦。所以,让我们做第一个。像这样:
def nextframe(i):
nonlocal xxUL, yyUL
xxUL = xxUL + 0
yyUL = yyUL - 5
myText = screen.create_text( xxUL, yyUL, text = "+1", font = "Arial 25", fill = "black" )
screen.update()
screen.delete( myText )
i += 1
if i != 25:
screen.after(0.05, lambda: nextframe(i))
else:
screen.delete( myText )
nextframe(0)
(我不知道这里的具体细节是否适用于您的实际代码 - 事实上,如果您的代码不使用Python 3.0+,或者您未在其他函数内部执行此操作,我知道它不会起作用。但是由于你没有显示你的实际代码,我必须做出一些猜测,希望你能理解如何适应它。)
有关详细信息,请参阅Why your GUI app freezes,或google获取有关事件循环或事件驱动编程的精彩教程。