如何在python中制作计时器而不冻结整个代码

Posted

技术标签:

【中文标题】如何在python中制作计时器而不冻结整个代码【英文标题】:How to make a timer in python without freezing up the entire code 【发布时间】:2019-08-28 06:42:24 【问题描述】:

我正在使用 Pygame 对马里奥进行编码,并且现在正在对积木进行编码。我想制作一个计时器,所以当我在一秒钟后击中积木块时,积木块会回到其原始位置以制作击球动画。问题是当让计时器进入睡眠状态时,它会在计时器期间冻结整个游戏。我需要运行代码并在一秒钟后启动前一个代码块。

我曾尝试使用 sleep 来制作计时器,但它会冻结整个游戏。谁能给我一些知识?谢谢!

【问题讨论】:

【参考方案1】:
from threading import Timer

def timeout():
    # do your stuff here

t = Timer(number_of_seconds, timeout)
t.start()

【讨论】:

【参考方案2】:

我建议你使用threading 模块和线程两个函数。

最后,你可以这样格式化:

from threading import Thread
if __name__ == '__main__':
    Thread(target = game()).start()
    Thread(target = timer()).start()

另一个选项是timeit 模块。您可以设置一个计时器并使用 if/while 语句检查何时到达某个时间。

第三个选项是你用于睡眠的时间模块:

import time

max_time = #the time you want
start_time = time.time()
while (time.time() - start_time) < max_time:
    game()

【讨论】:

【参考方案3】:
import sys
import time
import os

counter=0
s = 0
m = 0
n = int(input("Till How Many Seconds do you want the timer to be?: "))
print("")

while counter <= n:
    sys.stdout.write("\x1b[1A\x1b[2k")
    print(m, 'Minutes', s, 'Seconds')
    time.sleep(1)
    s += 1
    counter+=1
    if s == 60:
        m += 1
        s = 0

print("\nTime Is Over Sir! Timer Complete!\n")
beepPath = ("C:\\Users\\Farzeen Zargar\\Desktop\\Fizz Folder\\Videos\\Youtube Video Edits")
songs = os.listdir(beepPath)
os.startfile(os.path.join(beepPath, songs[13]))

【讨论】:

嗨@LumberFizz,欢迎来到***!您正在回答一个超过 1 年的问题。请尝试回答新问题,这更有帮助。并且不要只是添加代码块。解释你的答案,以便创作者能够向你学习。

以上是关于如何在python中制作计时器而不冻结整个代码的主要内容,如果未能解决你的问题,请参考以下文章

Ipython Widgets(如何制作计时器)

如何在Python中运行后台计时器

Python中的冻结Qt GUI

flash倒计时器制作

Flash 计时器中的文本动画

启动进程并等待退出代码而不冻结