2017-02-20 137 views
0

我有一個函數contMove(),當我點擊一個按鈕時,它會不斷地移動一個對象穿過tkinter窗口。但是,如果我單擊不止一次運行此函數的按鈕,它會加速,因爲第一個子例程尚未關閉,因爲我希望它連續運行,並且它們運行在彼此的頂部,加快了運動速度。我不希望它加速,所以我想要進行檢查,測試X或Y座標是否正在改變,增加的速度超過了我想要的速度,如果是的話,殺死子程序。這看起來似乎是一件普通的事情,但我能找到的有關時間模塊的一切都是關於日期和時鐘時間,或者是使用time.sleep,但我無法使用它,因爲我無法阻止移動。如果對不起,我搞砸了我的代碼的格式,當我把它放在這裏如何在z秒後x> x + y:?

def contMove(moving): 
    global a 
    global b 
    global X, Y 
    if moving: 
     a = a + X 
     b = b + Y 
     mover.place(x = a, y = b) 
     a, b, X, Y = edgeBounce(a, b, X, Y) 
     mover.place(x = a, y = b) 
     #would be here 
     mover.after(17, lambda: contMove(moving)) 
    else: 
     return 
+0

更改您到'通話after'的樣子,看看是否它有助於:'移動者。(17,移動,移動)'。 –

+0

我很困惑,你能把它放進去嗎?我真的不知道你的意思 – Feesih0ps

+0

刪除'mover.after(17,lambda:contMove(moving))',並用'mover.after(17,contMove,moving)'替換它。 –

回答

0

你需要改變你如何使用after。您目前使用它的方式,僅當after命令實際運行命令時,after命令纔會查找moving的值。因此,如果值在您撥打after的時間與after調用此功能的時間之間發生變化,您將獲得最新版本。

你想要的就是立刻給after賦值,這樣它就不必在運行該函數時查找該值。幸運的是after可以讓你提供傳遞給函數的位置參數。

要解決你的代碼,刪除此行:

mover.after(17, lambda: contMove(moving)) 

...以及與此行替換它:

mover.after(17, contMove, moving) 
+0

你告訴我什麼都沒有改變什麼,最後我發現我只需要在子程序開始時使用.after_cancel。 – Feesih0ps

相關問題