Python脚本出现UnboundLocalError错误,请求解决方法
解决UnboundLocalError: local variable 'toggled' referenced before assignment
错误原因
在on_press函数中执行toggled = not toggled时,Python会将toggled判定为局部变量,但这条语句需要先读取toggled的值才能完成取反操作,此时局部的toggled还未被定义,因此抛出UnboundLocalError。全局变量toggled默认不会被函数内的赋值语句直接引用,除非显式声明。
另外,原代码还有一处错误:keyboard = Controller是类的引用,而非实例化对象,必须改为keyboard = Controller()才能正常调用press和release方法。
解决方案
方案1:使用global声明全局变量
在on_press函数开头声明toggled为全局变量,让函数内的赋值操作直接修改全局变量:
from pynput.keyboard import Key, Controller, Listener import time keyboard = Controller() # 修正:实例化Controller key = "e" toggle = Key.f6 toggled = False def on_press(key): print(f"on_press() triggered, key = {key}") global toggled # 声明使用全局变量 if key == toggle: toggled = not toggled def on_release(key): print(f"on_release() triggered, key = {key}") with Listener(on_press=on_press, on_release=on_release) as listener: listener.join() while True: if toggled: keyboard.press(key) time.sleep(3) keyboard.release(key) time.sleep(1)
方案2:用可变对象存储状态(避免global)
如果不想使用global,可以用列表这类可变对象保存toggled状态,函数内可直接修改列表元素而无需额外声明:
from pynput.keyboard import Key, Controller, Listener import time keyboard = Controller() # 修正:实例化Controller key = "e" toggle = Key.f6 toggled = [False] # 用列表存储状态 def on_press(key): print(f"on_press() triggered, key = {key}") if key == toggle: toggled[0] = not toggled[0] # 修改列表元素 def on_release(key): print(f"on_release() triggered, key = {key}") with Listener(on_press=on_press, on_release=on_release) as listener: listener.join() while True: if toggled[0]: keyboard.press(key) time.sleep(3) keyboard.release(key) time.sleep(1)
内容的提问来源于stack exchange,提问作者alfiewander
相关产品推荐
相关产品推荐

