未声明局部变量-无法使用任何当前堆栈解决方案进行修复

时间:2019-02-22 03:51:55

标签: python evdev

我知道这是在这里多次询问的问题,但是即使在查看并尝试使用此站点上的所有解决方案后,也无法解决我的问题。这是我的代码:

def trackMouse():
    global x, y
    x = 0
    y = 0
    x_max = 1000
    y_max = 1000
    keyboardEvent = evdev.InputDevice('/dev/input/event0')
    mouseEvent = evdev.InputDevice('/dev/input/event1')
    async def print_events(device):
            async for event in device.async_read_loop():
                    if event.type == ecodes.EV_REL:
                            if event.code == ecodes.REL_X:
                                    print("REL_X")
                                    x += 1
                            if event.code == ecodes.REL_Y:
                                    print("REL_Y")
                                    y += 1
                    if event.type == ecodes.EV_KEY:
                            c = categorize(event)
                            if c.keystate == c.key_down:
                                    print(c.keycode)

    for device in keyboardEvent, mouseEvent:
            asyncio.ensure_future(print_events(device))

    loop = asyncio.get_event_loop()
    loop.run_forever()

运行此循环时出现的错误是:

  

从未检索到任务异常   未来:.print_events()完成,在以下位置定义:etho.py:113> exception = UnboundLocalError(“分配前引用的本地变量'a'”))>
  追溯(最近一次通话):
    _step
中的文件“ /usr/lib/python3.5/asyncio/tasks.py”,第239行       结果= coro.send(无)
    文件“ etho.py”,行124,在print_events中
      如果x + = 1:
  UnboundLocalError:赋值之前引用了局部变量'x'

无论我在哪里分配变量或声明它,当我尝试在if语句中使用它或将它添加到它时,它都会引发错误,但是当我只是将其设置为一个数字时,它不会引发错误。我认为这与其中的怪异循环有关。

1 个答案:

答案 0 :(得分:2)

print_events会将xy视为自身的局部变量,因为它们是在函数内部进行修改的,而不是在函数内部声明为全局的。由于要修改它们,因此需要在print_events内部添加全局声明它们:

async def print_events(device):
        global x, y
        async for event in device.async_read_loop():
        ...

请注意,将它们作为参数传递将不起作用,因为您想在函数内修改它们并在函数外访问修改后的值。