Python:Tkinter一个动画在另一个开始时停止

2024-09-24 02:24:15 发布

您现在位置:Python中文网/ 问答频道 /正文

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就会停在原来的位置,就停在那里。如果我再按一下,它会做同样的事,直到有几百个。我怎样才能使它永远不会停止动画,即使它在一个为循环?你知道吗


Tags: textinforcreaterangeplusdeletefill
1条回答
网友
1楼 · 发布于 2024-09-24 02:24:15

如果不使整个程序停止运行,就不能在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)

(我不知道这里的具体细节是否适用于您的实际代码,事实上,如果您的代码没有使用python3.0+,或者您没有在另一个函数中本地执行此操作,我知道它不起作用。但是由于您没有显示实际的代码,因此我不得不进行一些猜测,希望您能够理解如何调整它。)

有关详细信息,请参见Why your GUI app freezes;有关事件循环或事件驱动编程的良好教程,请参见google。你知道吗

相关问题 更多 >