1

我对 python 很陌生,我正在尝试 pygame。我有一个变量,我想将其设为 True,等待 1 秒,然后设为 False。我见过 time.sleep() 命令,但它会延迟整个程序,而我只想延迟这个,同时还要做其他事情。有谁知道如何做到这一点?

4

2 回答 2

1
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()。特别是如果您想降低到微秒(不计入由于硬件和操作系统实现而导致的错误),您还需要使内置计时器远离表。

第三但同样重要的是,这将帮助您进行实际编程,而不是依赖模块来完成所有事情,因为迟早,您将让您的程序员头脑进行测试,即使是最小的事情(例如计时器循环或方程式设置)也会有所帮助从长远来看,您可以解决问题。

于 2013-10-21T12:04:48.917 回答
0

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

import threading 

def func(): 
    print("2 seconds finished") 

timer = threading.Timer(2.0, func)
timer.start()

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

于 2020-07-19T03:08:48.573 回答