Python 3.9如何实现按下指定按键时通过async函数修改全局变量
实现方案
前置依赖
- 我们使用
aioconsole实现异步键盘监听,避免阻塞asyncio事件循环,先执行安装:pip install aioconsole
改造思路
你原来的同步代码中time.sleep(10)是阻塞调用,会导致整个程序卡住无法响应键盘事件,所以需要做以下改造:
- 将主业务循环改造为异步协程,把阻塞的
time.sleep替换为异步的asyncio.sleep - 单独实现一个异步键盘监听协程,后台运行检测按键输入,匹配到指定按键后直接修改全局变量
- 用asyncio的gather方法同时运行两个协程,实现业务逻辑和按键监听并行
完整参考代码
import asyncio import aioconsole # 你的原有全局变量,按实际需求初始化 putHerosToWork = False preventAFK = False isClientConnected = True # 这里为占位实现,替换为你原有代码的对应函数即可 def ConsoleLog(type, content): pass def CheckConnection(): pass def CheckNewMapEvent(): pass def CheckTimeEvents(): pass def doPutHerosToWork(): pass def doPreventAFK(): pass def cls(): pass # 异步键盘监听协程 async def key_listener(): global putHerosToWork, preventAFK while True: # 异步等待按键输入,不会阻塞事件循环 key = await aioconsole.ainput() # 按下k键切换英雄工作功能开关 if key.lower() == 'k': putHerosToWork = not putHerosToWork print(f"英雄工作功能已切换为: {'开启' if putHerosToWork else '关闭'}") # 按下p键切换防AFK功能开关,可按需求扩展其他按键 elif key.lower() == 'p': preventAFK = not preventAFK print(f"防AFK功能已切换为: {'开启' if preventAFK else '关闭'}") await asyncio.sleep(0.1) # 改造后的异步主业务循环 async def main_loop(): global isClientConnected while True: ConsoleLog("NEWLINE", "") if putHerosToWork == False and preventAFK == False: ConsoleLog("BLANK", "") CheckConnection() if isClientConnected == True: CheckNewMapEvent() CheckTimeEvents() # Put Heros to Work if putHerosToWork == True: doPutHerosToWork() # Prevent AFK if preventAFK == True: doPreventAFK() # 替换原来的同步sleep为异步sleep await asyncio.sleep(10) cls() async def main(): # 同时运行主业务循环和键盘监听协程 await asyncio.gather( main_loop(), key_listener() ) if __name__ == "__main__": asyncio.run(main())
注意事项
- 协程内修改全局变量必须加
global声明,否则会被识别为局部变量报错 - 业务逻辑中如果有其他阻塞操作(比如网络请求、文件读写)也要对应替换为异步版本,否则会卡住事件循环导致按键不响应
- 如果需要监听组合键或者不需要回车确认的热键,可以替换为
keyboard库配合异步队列实现,核心逻辑不变
内容的提问来源于stack exchange,提问作者Iván S. Rodríguez
相关产品推荐
相关产品推荐

