我对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(),如果你想在任务发生之前停止。