stringvariable.set方法,用于将字符串从Python函数传输到Tkinter

时间:2016-12-15 10:58:34

标签: tkinter python-3.4

我正在追随一个巧妙的(基于“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)指令在简化版本中工作而不是首选版本。 先感谢您, 奥利弗

1 个答案:

答案 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)