Доступ / назначение глобальной переменной внутри функции события нажатия клавиши - PullRequest
0 голосов
/ 22 января 2020

Я пытаюсь использовать функцию события нажатия клавиши для прокрутки графиков данных, которые я сгенерировал. Код должен выполнить простую проверку, чтобы увидеть, является ли текущая позиция допустимым индексом, а затем обновить значение curr_pos при заданном нажатии клавиши.

     def test_key():
        import matplotlib.pyplot as plt

        curr_pos=0
        dt = 1
        numtimes = 5

        def key_event(e):
            global curr_pos

            if curr_pos - dt <= 0:
                if e.key == "right":
                    curr_pos = curr_pos + dt
                else:
                    return
            elif curr_pos + dt >= numtimes:
                if e.key == "left":
                    curr_pos = curr_pos - dt
                else:
                    return
            else:
                if e.key == "right":
                    curr_pos = curr_pos + dt
                elif e.key == "left":
                    curr_pos = curr_pos - dt
                else: 
                    return
                ax.cla()
                ax.plot([1,1,1], [1,1,1])
                ax.title('time index: '+str(curr_pos))
                fig.canvas.draw()
        fig = plt.figure()
        fig.canvas.mpl_connect('key_press_event', key_event)
        ax = fig.add_subplot(111)
        ax.plot([1,1,1], [1,1,1])
        plt.show()

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

Traceback (most recent call last):
  File "/home/ckswee/.local/lib/python3.6/site-packages/matplotlib/cbook/__init__.py", line 216, in process
    func(*args, **kwargs)
  File "/home/ckswee/Documents/strahl/test_key.py", line 18, in key_event
    if curr_pos - dt <= 0:
NameError: name 'curr_pos' is not defined

Нужно ли определять мою переменную curr_pos другим способом, чтобы иметь к ней доступ?

1 Ответ

0 голосов
/ 22 января 2020

В указанном вами коде curr_pos определяется как локальная переменная в области действия test_key(), , а не глобальной области действия. Рассмотрим следующий простой пример:

def a():
    i = 0
    def b():
        print(i)
    b()

a()

, который будет работать без ошибок, поскольку print(i) ссылается на переменную i, которая была объявлена ​​в области действия a(). Теперь, если мы сделаем

def a():
    i = 0
    def b():
        global i
        print(i)
    b()

a()

print(i), теперь ищем i, который был объявлен в глобальной области видимости, и не находим ничего, это выдает ошибку. Правильная декларация будет

def a():
    global i
    i = 0
    def b():
        global i
        print(i)
    b()

a()

Или

I = 0
def a():
    def b():
        global i
        print(i)
    b()

a()

Любая из которых будет работать правильно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...