Python定时器实现快速时间事件时,替换超时触发函数遇阻求助
解决QTE超时替换自定义函数的问题
问题根源
- 原代码中
input()会阻塞主线程,超时后Timer线程执行自定义函数时,主线程仍卡在输入等待,导致流程无法推进 - 自定义函数若涉及终端交互,会和主线程的
input()输出冲突,引发显示混乱 - 原代码缺少对
random模块的导入,会直接触发运行错误
修正方案
以下是调整后的代码,解决了线程阻塞、函数触发异常的问题:
import time import random import sys from threading import Timer # 确保menu模块已正确导入,例如:import menu def timeout_handler(): print("\nYou timed out!") # 执行自定义跳转函数 menu.hall() # 关闭标准输入,终止主线程的input阻塞 sys.stdin.close() # 随机延迟触发QTE time.sleep(random.randint(1,5)) timeout = 5 # 创建Timer,绑定自定义超时处理逻辑 timer = Timer(timeout, timeout_handler) timer.start() start_time = time.time() prompt = f"You have {timeout} seconds to dodge, press enter...\n" try: answer = input(prompt) # 用户输入成功,取消定时器 timer.cancel() end_time = time.time() reaction_time = end_time - start_time if reaction_time < timeout: print(f"You dodged in {reaction_time:.2f}! ") time.sleep(3) menu.startp() except EOFError: # 捕获输入关闭的异常,对应超时场景的主线程收尾 pass
关键调整说明
- 超时处理函数:新增
timeout_handler(),执行自定义函数后关闭标准输入,强制终止主线程的input()阻塞,让QTE流程正常结束 - 异常捕获:捕获
EOFError(输入关闭时触发),处理超时后的主线程收尾逻辑 - 线程协调:避免多线程同时操作终端导致的输出混乱,通过关闭输入让主线程退出阻塞状态
- 补全依赖:添加了缺失的
random模块导入,修复原代码的运行错误
内容的提问来源于stack exchange,提问作者Mareks Zuks
相关产品推荐
相关产品推荐

