2014-01-15 94 views
0
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循環中?Python:Tkinter - 一個動畫在另一個動畫開始時停止

+0

請發佈[最小,完整,有效示例](http://stackoverflow.com/help/mcve),而不僅僅是一段隨機代碼。 – abarnert

回答

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瞭解更多細節,或谷歌的事件循環或事件驅動的編程一個很好的教程。

相關問題