同事,
我正在设计一个带有两个按钮的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'
我在这里缺少什么?
答案 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
的重新定义才有意义。如果您打算添加其他功能,例如定期更新,原始代码是正确的,正如布莱恩指出的那样。