如何在python/pygame中延迟一件事,同时不延迟其他事情



我对python很陌生,我正在尝试pygame。我有一个变量,我想让它成为真,等待 1 秒,然后做假。我已经看到了 time.sleep() 命令,但它延迟了整个程序,而我只想延迟它,同时仍在做其他事情。有谁知道如何做到这一点?

from time import sleep, time
started = time() # Current time saved, say 13:00
sleep(60) # <- This will freeze stuff
ended = time() # Ended at 13:01
print(started-ended,'seconds were slept')

现在,上面的例子显示了如何利用 time() 来检查某些持续时间。只要开始时间放置在循环之外,就可以在循环中使用相同的方法来测量时间,如下所示:

溶液:

from time import sleep, time
last_time = time()
while 1:
    if time()-last_time > 1:
        print('One second has passed')
        last_time = time()
    else:
        ## The print() and sleep() is just here for debug purposes
        ## And in a graphical application you can remove the two below.
        print('Still waiting for one second to pass')
        sleep(0.25)

为什么这是一个解决方案?

首先,我喜欢在尽可能低的级别上控制

事物,而不会在混乱的代码上浪费时间(在python中,"尽可能低"不一定在较低级别,但您可以通过不使用预打包模块来控制功能的某些方面)。

几乎所有的Python图形模块(Pygame,Pyglet,Panda等)都有内部计时器,它们通常与渲染过程中的时序相关,如果不是,它仍然是一个内置函数来控制时序,缺乏精度和灵活性。

现在它们对基本的东西很好,我必须同意,但是一旦你想同时做多件事,甚至在图形库之外使用时序循环,你最好使用本机time()循环来保持简单和干净。特别是如果你想降到微秒(不计入由于硬件和操作系统实现而导致的错误),你还需要让内置计时器远离桌子。

第三但并非最不重要的一点是,这将帮助您进行实际编程,而不是依赖模块来完成所有事情,因为迟早,您会对程序员的思想进行测试,即使是最小的事情,例如计时器循环或方程设置,从长远来看也将帮助您解决问题。

最好,使用python的线程功能。这将在 2 秒后自动调用 func,即使程序的其余部分将毫无延迟地运行

import threading 
def func(): 
    print("2 seconds finished") 
timer = threading.Timer(2.0, func)
timer.start()

也可以使用 timer.cancel(),如果你想在任务发生之前停止。

最新更新