Python:Tkinter - 当另一个动画开始时,一个动画停止

时间:2014-01-15 20:00:39

标签: python tkinter

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循环?

1 个答案:

答案 0 :(得分:1)

如果不使整个程序停止运行,则不能在Tkinter回调中使用sleep。毕竟,这正是sleep(0.05)的意思:让整个程序停止运行0.05秒。

它不仅仅是sleep - 无论这个功能是什么,在它运行的时候,那就是正在运行的代码;没有其他代码可以运行,因此您的UI会被冻结。

有两种基本解决方案:

  • 更改您的功能,使其执行动画的一个步骤,安排下一步在0.05秒内作为回调运行,然后返回。
  • 使用后台主题。

第二个可能看起来更简单,但不幸的是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获取有关事件循环或事件驱动编程的精彩教程。