Python中如何同时运行两个独立while循环实现实时时钟与交互菜单
问题解决方法
你没法同时运行两个阻塞式的while循环——时间循环里的sleep(1)、菜单循环里的input()都会卡住单线程的执行流程,要实现顶部时间自动刷新+菜单正常交互,用后台线程跑时间刷新逻辑,搭配终端光标控制固定时间的刷新位置即可,不会打乱输入区域。
完整可运行代码
import threading import sys import colorama from time import sleep, strftime, gmtime from colorama import Fore # 全局退出标记,供两个线程同步状态 exit_flag = False def refresh_top_time(): """后台线程函数:每秒刷新顶部固定位置的时间""" while not exit_flag: # 保存当前光标位置 sys.stdout.write("\033[s") # 把光标移动到终端第1行第1列 sys.stdout.write("\033[1;1H") # 清空当前行旧的时间内容 sys.stdout.write("\033[2K") # 写入最新时间 current_time = strftime("%a, %d %b %Y %I:%M:%S %p %Z", gmtime()) sys.stdout.write(current_time) # 把光标恢复到之前的输入位置,不打断用户输入 sys.stdout.write("\033[u") sys.stdout.flush() sleep(1) def menu_1(): print("执行菜单1对应逻辑") def menu_2(): print("执行菜单2对应逻辑") if __name__ == "__main__": colorama.init() # 初始化colorama,Windows终端也能正常识别光标控制码 # 预留顶部两行位置:第一行放时间,第二行留空 print("\n") # 启动时间刷新的守护线程,主线程退出时该线程自动终止 time_daemon = threading.Thread(target=refresh_top_time, daemon=True) time_daemon.start() # 正常跑菜单循环 while not exit_flag: menu_tip = ( "[1] Menu1\n" "[2] Menu2\n" "[3] Exit\n" f"{Fore.RESET}请输入选项: " ) choice = input(menu_tip) if choice == "1": menu_1() elif choice == "2": menu_2() elif choice == "3": print("Exiting...") exit_flag = True else: print("无效选项,请重新输入") sleep(0.5)
关键注意点
- 你原来贴的时间打印代码里,
print(strftime(...))缺少右括号,直接运行会触发语法错误,记得补上 - 不要直接顺序写两个while循环:单线程下阻塞调用会导致要么时间不刷新,要么菜单没法输入
- 用ANSI光标控制码刷新时间的方式,不会像普通
print一样每次刷时间都新起一行,也不会冲掉用户输入到一半的内容,界面和你预期的效果完全一致 - 时间线程设置为守护线程+全局退出标记,退出程序时不会残留后台进程卡终端
内容的提问来源于stack exchange,提问作者Alan Z.
相关产品推荐
相关产品推荐

