如何在Python循环中暂停执行speedUp后恢复按键状态与进度?
解决方案
核心思路是把长时长的time.sleep拆分成小段循环检查,同时维护当前按键/鼠标的按下状态,这样每到30秒节点时可以临时释放状态、执行speedUp,再恢复状态继续执行剩余时长。
步骤1:添加状态管理与分段睡眠函数
先定义全局变量跟踪状态,再实现支持中断检查的睡眠函数:
import pyautogui import time # 全局状态跟踪 last_speedup_time = time.time() pressed_keys = set() pressed_mouse_buttons = set() def sleep_with_check(duration): global last_speedup_time start_time = time.time() elapsed = 0 while elapsed < duration: # 检查是否到了30秒间隔 if time.time() - last_speedup_time >= 30: # 临时释放所有按键和鼠标 for key in pressed_keys: pyautogui.keyUp(key) for btn in pressed_mouse_buttons: pyautogui.mouseUp(button=btn) # 执行speedUp并等待0.1秒 speedUp() time.sleep(0.1) # 恢复之前的按键和鼠标状态 for key in pressed_keys: pyautogui.keyDown(key) for btn in pressed_mouse_buttons: pyautogui.mouseDown(button=btn) last_speedup_time = time.time() # 每次睡0.01秒,避免阻塞太死 sleep_chunk = min(0.01, duration - elapsed) time.sleep(sleep_chunk) elapsed = time.time() - start_time
步骤2:重构原有操作函数
把原来的RunD、RunA等函数改成用全局状态跟踪,并调用自定义睡眠函数:
def RunD(Down, Up): global pressed_keys, pressed_mouse_buttons # 记录按下状态 pressed_keys.add('d') pressed_mouse_buttons.add('left') pyautogui.keyDown('d') pyautogui.mouseDown(button='left') sleep_with_check(Down) pyautogui.keyUp('d') pyautogui.mouseUp(button='left') # 移除状态 pressed_keys.remove('d') pressed_mouse_buttons.remove('left') sleep_with_check(Up) # 其他类似函数按同样方式重构(示例) def RunA(Down, Up): global pressed_keys pressed_keys.add('a') pyautogui.keyDown('a') sleep_with_check(Down) pyautogui.keyUp('a') pressed_keys.remove('a') sleep_with_check(Up) def Advance(Down, Up): global pressed_keys pressed_keys.add('w') # 按实际操作修改按键 pyautogui.keyDown('w') sleep_with_check(Down) pyautogui.keyUp('w') pressed_keys.remove('w') sleep_with_check(Up) def EnterD(Down, Up): global pressed_keys pressed_keys.add('d') pressed_keys.add('enter') # 按实际操作修改按键组合 pyautogui.keyDown('d') pyautogui.keyDown('enter') sleep_with_check(Down) pyautogui.keyUp('d') pyautogui.keyUp('enter') pressed_keys.remove('d') pressed_keys.remove('enter') sleep_with_check(Up) def EnterA(Down, Up): global pressed_keys pressed_keys.add('a') pressed_keys.add('enter') # 按实际操作修改按键组合 pyautogui.keyDown('a') pyautogui.keyDown('enter') sleep_with_check(Down) pyautogui.keyUp('a') pyautogui.keyUp('enter') pressed_keys.remove('a') pressed_keys.remove('enter') sleep_with_check(Up) def speedUp(): # 写入你的speedUp逻辑 pass def buff(): # 写入你的buff逻辑 pass
步骤3:调整主循环
主循环保持原有逻辑,所有sleep已替换为带检查的版本,会自动触发每30秒的speedUp:
buff() # 初始调用一次 last_speedup_time = time.time() # 初始化speedup计时 for i in range(15): RunA(34.5,0) Advance(1,0) EnterD(0.2,0) RunD(34.5,0) Advance(1,0) EnterA(0.2,0)
关键说明
- 分段睡眠的间隔(0.01秒)可按需调整,越小响应越及时,但会略微增加CPU占用。
- 所有操作函数必须严格更新
pressed_keys和pressed_mouse_buttons集合,确保状态准确。 - 若有组合键或多鼠标按钮操作,只需在集合中添加对应元素,恢复时会全部重新按下。
内容的提问来源于stack exchange,提问作者Fares Dhouib
相关产品推荐
相关产品推荐

