Python宏触发无限循环求助:输入medo1后脚本异常自行输入
脚本问题修复方案
问题根源
- 无限循环:pyautogui模拟输入的按键会被pynput的Listener捕获,反复触发
on_press函数,形成死循环。 - last5状态混乱:模拟输入的按键会覆盖手动重置的
last5值,导致变量无法按预期修改。 - 误触发与无效按键处理:未过滤Shift、Enter等非打印字符,且匹配逻辑(
d in m)容易触发误操作。
修复后的完整代码
from pynput.keyboard import Key, Listener import pyautogui as pa import time as t musics = ['medo1=link1', 'medo2=link2', 'medo3=link3', 'medo4=link4', 'medo5=link5'] last5 = ['a', 'a', 'a', 'a', 'a'] is_simulating = False # 标记是否处于模拟输入阶段 def on_press(key): global last5, is_simulating # 模拟输入时跳过按键监听,避免循环触发 if is_simulating: return # 按ESC终止监听程序 if key == Key.esc: return False d = ''.join(last5) try: # 仅处理可打印的字符按键 if key.char is not None: last5.append(key.char) last5.pop(0) d = ''.join(last5) except AttributeError: # 非字符按键(如Shift、Ctrl)直接跳过 pass # 精确匹配触发词 for m in musics: trigger_word = m.split('=')[0] if d == trigger_word: is_simulating = True # 删除输入的触发词(长度等于触发词字符数) pa.press('backspace', presses=len(trigger_word)) # 执行预设输入操作 pa.typewrite(f'b.p {m.split("=")[1]}') t.sleep(0.03) pa.press("enter") pa.typewrite('b.loop all') t.sleep(0.1) pa.press("enter") # 重置last5,避免后续误触发 last5 = ['a', 'a', 'a', 'a', 'a'] is_simulating = False break with Listener(on_press=on_press) as listener: listener.join()
核心修复说明
- 模拟输入隔离:新增
is_simulating标记,当脚本自动输入内容时,暂停按键监听,彻底切断循环触发的链路。 - 精确匹配逻辑:将模糊匹配
d in m改为完全匹配触发词d == trigger_word,避免因部分字符重叠导致的误操作。 - 合理清理输入:把固定99次backspace改为按触发词长度删除,避免误删其他内容。
- 有效按键过滤:只处理带有效
char的按键,忽略Shift、Enter等非打印按键,保证last5的更新逻辑稳定。 - 正确退出机制:修改ESC按键的返回值为
False,确保能正常终止Listener程序。
内容的提问来源于stack exchange,提问作者Mateus Bermudes Magalhães
相关产品推荐
相关产品推荐

