无法更新TKinter图

时间:2015-07-20 22:33:11

标签: user-interface python-3.x tkinter tkinter-canvas

同事,

我正在设计一个带有两个按钮的GUI,一个是显示图表,即每小时温度。 我面临的问题是我无法创建一个用self.after更新值的函数(update_graph)。

这部分创建了第1页,我工作正常,直到我调用update_graph

class PageOne(tk.Frame):

    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        label = tk.Label(self, text="Page One!!!", font=LARGE_FONT)
        label.pack(pady=10,padx=10)

        button1 = tk.Button(self, text="Back to Home",
                            command=lambda: controller.show_frame(StartPage))
        button1.pack()

        button2 = tk.Button(self, text="Page Two",
                            command=lambda: controller.show_frame(PageTwo))
        button2.pack()

        canvas = Canvas(self, width=400, height=400, bg = 'white')
        canvas.pack()

    # create x and y axes
        canvas.create_line(100,250,400,250, width=2)
        canvas.create_line(100,250,100,50,  width=2)

# creates divisions for each axle    
        for i in range(11):
            x = 100 + (i * 30)
            canvas.create_line(x,250,x,245, width=2)
            canvas.create_text(x,254, text='%d'% (10*i), anchor=N)

        for i in range(6):
            y = 250 - (i * 40)
            canvas.create_line(100,y,105,y, width=2)
            canvas.create_text(96,y, text='%5.1f'% (50.*i), anchor=E)

        self.update_graph()

    def update_graph(self):
# here is canvas create line that causes a trouble                     
        canvas.create_line(100,250,140,200, width=2)
        self.after(100,self.update_graph)


Whith this code I get an error "canvas is not defined".

If I add self to canvas in update_graph, I get

 self.canvas.create_line(100,250,140,200, width=2)
AttributeError: 'PageOne' object has no attribute 'canvas'

我在这里缺少什么?

1 个答案:

答案 0 :(得分:1)

canvas仅在构造函数(__init__)方法的范围内定义。如果您希望能够在类中的其他位置访问它,则需要将其设为实例变量。而不是,

 canvas = Canvas(self, width=400, height=400, bg = 'white')

制作它,

 self.canvas = Canvas(self, width=400, height=400, bg = 'white')

现在,您引用canvas的代码中的其他位置,将其更改为self.canvas。这应该可以解决问题。

在一个不相关的说明中,我在update_graph中看到的一个问题是它以递归方式或一遍又一遍地调用自身。也许你可以把它改成这样的东西:

    def update_graph(self):
        # This line is quite long. Maybe you could shorten it?
        self.after(100, lambda: canvas.create_line(100,250,
                                                   140,200, width=2))

希望这有帮助!

编辑:如果您想要绘制一条固定线,我对update_graph的重新定义才有意义。如果您打算添加其他功能,例如定期更新,原始代码是正确的,正如布莱恩指出的那样。