在按键事件功能内部访问/分配全局变量

时间:2020-01-22 00:06:28

标签: python matplotlib canvas global-variables

我正在尝试使用按键事件功能来滚动浏览我生成的数据图。该代码应进行简单检查,以查看当前位置是否为有效索引,然后在给定击键时更新curr_pos的值。

<button id="boton1" onclick="doSomething()">
Click
</button>

代码已简化了很多,显然我不是在这里尝试绘制一堆代码。我从文件中读取数据,并且不想在上载此问题时进行处理。无论如何,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才能像这样访问它?

1 个答案:

答案 0 :(得分:0)

在您给出的代码中,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()

其中任何一个都可以正常工作