如何在z秒后x> x + y:?

问题描述:

我有一个函数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)'替换它。 –

你需要改变你如何使用after。您目前使用它的方式,仅当after命令实际运行命令时,after命令才会查找moving的值。因此,如果值在您拨打after的时间与after调用此功能的时间之间发生变化,您将获得最新版本。

你想要的就是立刻给after赋值,这样它就不必在运行该函数时查找该值。幸运的是after可以让你提供传递给函数的位置参数。

要解决你的代码,删除此行:

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

...以及与此行替换它:

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

你告诉我什么都没有改变什么,最后我发现我只需要在子程序开始时使用.after_cancel。 – Feesih0ps