Локальная переменная не объявлена ​​- не может быть исправлена ​​никакими текущими решениями стека - PullRequest
0 голосов
/ 22 февраля 2019

Я понимаю, что этот вопрос задавался здесь несколько раз, но даже после просмотра и попытки использовать все решения на этом сайте, ни одно из них не решило мою проблему.Вот мой код:

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> исключение = UnboundLocalError («локальная переменная« a », на которую ссылаются до назначения»,)>
Traceback (последний вызов был последним):
File »/usr/lib/python3.5/asyncio/tasks.py ", строка 239, в _step
result = coro.send (None)
Файл" etho.py ", строка 124, в print_events
, если x + = 1:
UnboundLocalError: локальная переменнаяСсылка 'x' перед присваиванием

независимо от того, где я присваиваю переменную или объявляю ее, она выдаст ошибку, когда я попытаюсь использовать ее в операторе if или добавить к ней, но не когда я простоустановите его равным числу.Я думаю, что это как-то связано со странным циклом, в котором он находится.

1 Ответ

0 голосов
/ 22 февраля 2019

print_events рассматривает x и y как локальные для себя, так как они изменены внутри функции и не объявлены глобальными внутри функции.Так как вы хотите изменить их, вам нужно добавить объявить их глобальными внутри print_events:

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

Обратите внимание, что передача их в качестве аргументов не будет работать, так как вы хотите изменить их внутри функции и получить доступ кизмененные значения вне функции.

...