我想在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'
我很确定,调用的方式就是问题。所以,如果有人可以帮助我,那么我要么感谢提示功能的好教程,要么如何调用使用它们。
答案 0 :(得分:1)
您正在尝试致电self.after()
,self
是KopfFrame
班级的实例。该类没有定义这样的方法。
也许你想在这里打电话给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()
方法。