You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 15:15:31