我正在追随一个巧妙的(基于“stackoverflow”中提供的代码示例和其他方法,用于在包含许多框架页面的Tkinter应用程序周围传输datetime.utcnow内容。我使用的方法是定义一致命名的时间标签每个帧上的对象,并在第一个(HomePage)帧上声明全局time1和time1 = tk.StringVar()。我的函数创建一个包含时间戳的字符串,该时间戳使用strftime方法格式化,如下所示
time1=datetime.utcnow()
time1=time1.strftime('%Y-%m-%d %H:%M:%S')
time1=('Time: ' + time1)
def second_tick():
global time2, time1, stroke_time
current_time = datetime.utcnow()
current_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
time2 = ('Time: ' + current_time)
if time2 != time1:
time1.set(time2)
time1=time2
print(time2, current_time[14:19])
# calls itself every 200 milliseconds (5 times a second)
app.after(200, second_tick)
当我运行此代码时,它失败并显示以下消息: time1.set(时间2) AttributeError:'str'对象没有属性'set'
然而,当我将函数简化为下面的表单时,代码运行得非常完美:
def second_tick():
global time2, time1, stroke_time
current_time = datetime.utcnow()
current_time = current_time.strftime('%Y-%m-%d %H:%M:%S')
time2 = ('Time: ' + current_time)
time1.set(time2)
print(time2, current_time[14:19])
# calls itself every 200 milliseconds (5 times a second)
app.after(200, second_tick)
我想使用前一版本以高于一秒的速率减少屏幕刷新的需要(以及其他原因)。任何人都可以解释为什么time1.set(time2)指令在简化版本中工作而不是首选版本。 先感谢您, 奥利弗
答案 0 :(得分:1)
time1=datetime.utcnow()
time1=time1.strftime('%Y-%m-%d %H:%M:%S')
time1=('Time: ' + time1)
#also in second_tick as well
time1=time2
在这些行中,您将time1
更改为string
。不是以这种方式分配,而是将StringVar
的值设置为该字符串。
time1.set('Time: ' + datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S'))
编辑:针对他/她自己问题的OP解决方案(取自评论)
time2=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
def second_tick():
global time2, time3, stroke_time
time3=datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
if time3 != time2:
time1.set('Time: ' + time3)
time2=time3
print(time2, time3)
# calls itself every 200 milliseconds (5 times a second)
app.after(200, second_tick)