我正在尝试编写一个Python程序,该程序具有相同类的多个标签,每个标签显示创建每个新实例时声明的不同时区的时间。
目前time_string_format
是全球性的。我的想法是,通过在调用类之前更改全局,我可以为每个类的实例设置不同的字符串格式。
这是班级:
class winMain(Frame):
def __init__(self, app):
Frame.__init__(self, app)
# establish the base font in a variable so it can be dynamically changes later
self.base_font = "Times"
self.base_font_size = int(38)
# Create object lblDTG_ associated with variable lblDTG
self.lblDTG = StringVar()
lblDTG_ = Label(self, textvariable=self.lblDTG, text='lblDTG Not Set!', font=(self.base_font, self.base_font_size))
lblDTG_.bind('<Double-Button-1>', self.onDoubleLeftClick)
lblDTG_.bind('<Button-1>', self.onLeftClick)
lblDTG_.bind('<Button-2>', self.onMiddleClick)
lblDTG_.bind('<Button-3>', self.onRightClick)
lblDTG_.pack(fill=X, expand=1)
# start the clock
time_format = time_string_format
self.set_time(time_format)
def set_time(self, time_format):
# update the DTG
self.lblDTG.set(datetime.datetime.utcnow().strftime(time_format).upper())
现在,时间是在创建类时设置的,但从未更新过。我可以像下面这样使用尾递归,但是当超过递归深度时,我最终会遇到堆栈错误。
def set_time(self, time_format):
# update the DTG
self.lblDTG.set(datetime.datetime.utcnow().strftime(time_format).upper())
self.after(1000, self.set_time(time_format)
有没有办法使用迭代来做到这一点?当时钟正在运行时,我仍然希望能够通过绑定更改时区,字符串格式等来与它们进行交互。我担心使用'for'或'while'循环会冻结界面。
答案 0 :(得分:0)
这里的问题是 indvertant 递归:
def set_time(self, time_format):
# update the DTG
self.lblDTG.set(datetime.datetime.utcnow().strftime(time_format).upper())
self.after(1000, self.set_time(time_format)
最后一行应类似于:
self.after(1000, self.set_time, time_format)
对set_time
的调用不应像当前编写的那样 now 执行,而应从现在起1秒 执行。这样可以避免它成为递归对象,也不会出现堆栈溢出。