如何让Python中if语句在30秒后生效?无需threading实现需求
问题分析与解决方案
你的原代码逻辑完全错误:input()会阻塞程序直到用户输入完成,之后才会执行time.sleep(30),根本无法实现“30秒内未输入就触发关机”的需求。
下面是符合需求的代码(基于Windows系统,适配你使用的shutdown /s命令):
import os import time import msvcrt print('你的电脑会在以下两种情况下关机:不参与游戏,或者游戏失败') timeout = 30 start_time = time.time() user_input = '' print(f'12乘以13等于多少?你有{timeout}秒时间输入。') while time.time() - start_time < timeout: # 检测是否有按键输入 if msvcrt.kbhit(): # 读取输入内容直到回车,模拟input()的交互体验 user_input = '' while True: char = msvcrt.getch().decode('utf-8') if char == '\r': # 回车代表输入结束 print() # 换行对齐后续输出 break user_input += char print(char, end='', flush=True) # 实时显示输入的字符 break # 有输入就跳出超时等待循环 # 根据输入结果执行对应逻辑 if user_input == '156': print('回答正确,程序退出') exit() elif not user_input: print('你甚至都没尝试输入') os.system("shutdown /s /t 1") else: print('回答错误') os.system("shutdown /s /t 1")
代码说明
- 用
msvcrt.kbhit()检测按键输入,避免input()的阻塞问题,实现限时等待 - 通过时间差计算30秒超时时间,到点自动进入判断逻辑
- 实时回显输入字符,和原生
input()的交互体验一致 - 完全匹配需求逻辑:
- 30秒无输入:打印提示并执行关机
- 输入正确答案“156”:直接退出程序
- 输入其他内容:立即执行关机
内容的提问来源于stack exchange,提问作者NielsNL
相关产品推荐
相关产品推荐

