类中的Python属性错误

时间:2017-01-03 16:26:13

标签: python python-2.7 tkinter

我想在Tkinter中创建一些帧,应该定期更新。 以下是关于它们的代码:

from Tkinter import *
import time
import random

class KopfFrame:
    def __init__(self,master):
        frame = Frame(master,bg="tan")
        frame.pack(side=TOP,expand=YES, fill=BOTH)
        self.ZeitLabel = Label(frame)
        self.ZeitLabel.pack(side=RIGHT, expand=NO,ipadx=2, ipady=2)
        self.refresh()

    def refresh(self):
        self.ZeitLabel.configure(text=time.strftime("%H:%M:%S"))
        # call this function again in 5 seconds
        #print(self)
        self.after(5000, self.refresh)

root = Tk()
K = KopfFrame(root)
root.mainloop()

但是,当我运行它时,我有错误:

AttributeError: KopfFrame instance has no attribute 'after'

我很确定,调用的方式就是问题。所以,如果有人可以帮助我,那么我要么感谢提示功能的好教程,要么如何调用使用它们。

1 个答案:

答案 0 :(得分:1)

您正在尝试致电self.after()selfKopfFrame班级的实例。该类没有定义这样的方法。

也许你想在这里打电话给Frame.after() method。您需要先存储对您传递的Frame对象的引用,然后在 上调用after

class KopfFrame:
    def __init__(self,master):
        # make frame an attribute on self
        self.frame = Frame(master, bg="tan")
        self.frame.pack(side=TOP,expand=YES, fill=BOTH)
        self.ZeitLabel = Label(self.frame)
        self.ZeitLabel.pack(side=RIGHT, expand=NO,ipadx=2, ipady=2)
        self.refresh()

    def refresh(self):
        self.ZeitLabel.configure(text=time.strftime("%H:%M:%S"))
        # now you can reach the frame and call after on that:
        self.frame.after(5000, self.refresh)

我改变了什么:

  • 不要仅在frame方法中将KopfFrame.__init__设为本地,而是将其设为self上的属性。

  • 使用self.frame对[{1}}中框架的引用来访问KopfFrame.refresh()方法。