未使用playsound库的Python闹钟计时器显示异常,ANSI escape codes引发问题
解决ANSI转义码导致计时器延迟显示的问题
你的计时器直到剩余时间为00:00才显示,核心原因是Python标准输出的行缓冲机制——默认情况下,print的内容会先存到缓冲区,直到程序结束或缓冲区触发刷新条件才会显示到终端,和ANSI转义码本身无关。
修复方案:强制刷新输出缓冲区
只需在print语句中添加flush=True参数,强制每次输出立即刷新到终端:
import time Clear = "\033[2J" Clear_and_return = "\033[H" def alarm(seconds): time_elapsed = 0 print(Clear) while time_elapsed < seconds: time.sleep(1) time_elapsed += 1 time_left = seconds - time_elapsed min_left = time_left // 60 sec_left = time_left % 60 # 新增flush=True强制刷新缓冲区 print(f"{Clear_and_return} Time left till alarm: {min_left:02d}:{sec_left:02d}", flush=True) minutes = int(input("Minutes: ")) seconds = int(input("Seconds: ")) alarm(minutes * 60 + seconds)
原理说明
Python的print默认采用行缓冲,只有当输出包含换行符、缓冲区满,或者程序退出时才会自动刷新。你的代码中虽然每次循环都执行了print,但time.sleep(1)导致缓冲区没有被及时触发刷新,所以所有输出都被暂存,直到循环结束才一次性显示最后一条内容。添加flush=True会绕过缓冲机制,让每一次的倒计时内容立即显示在终端上。
另一种实现方式(用sys.stdout)
也可以直接使用sys.stdout.write结合sys.stdout.flush来实现相同效果:
import time import sys Clear = "\033[2J" Clear_and_return = "\033[H" def alarm(seconds): time_elapsed = 0 print(Clear) while time_elapsed < seconds: time.sleep(1) time_elapsed += 1 time_left = seconds - time_elapsed min_left = time_left // 60 sec_left = time_left % 60 sys.stdout.write(f"{Clear_and_return} Time left till alarm: {min_left:02d}:{sec_left:02d}") sys.stdout.flush() minutes = int(input("Minutes: ")) seconds = int(input("Seconds: ")) alarm(minutes * 60 + seconds)
内容的提问来源于stack exchange,提问作者A A T H I
相关产品推荐
相关产品推荐

