Tkinter无法更新StringVar

时间:2015-06-17 20:49:43

标签: python-3.x tkinter tkinter-canvas

我正在阅读序列信息,并希望将其传递给Tkinter中的GUI。 这段代码工作正常,但是当我想使用canvas时(因为我会做一个仪表板类型的GUI),我没有在GUI上打印出来。

if __name__ == '__main__':
    pass

import serial
from tkinter import *
import tkinter as tk
import tkinter.font as tkf

ser = serial.Serial('COM2')
ser.baudrate = 9600

def update():
    c = StringVar()
    c=ser.readline()
    theta.set(c)  
    root.after(100,update)

root=Tk()
root.title("viento")
theta = StringVar()

w = Label(root, textvariable = theta, font ="Times 16 bold", fg="red")
w.pack()

root.after(100,update)    
root.mainloop()

一旦我用

更改标签声明
w=Canvas(root,width = 200, height= 100)
w.pack()
w.create_text(100,50,text=theta.get())

我得到一个空的GUI。有什么问题?

2 个答案:

答案 0 :(得分:1)

据我所知,您不能使用StringVar来设置Canvas上显示的文本。但是,您可以获取在画布上创建的文本的ID和re-configure it afterwards

这样的事情:

def update():
    w.itemconfigure(text_id, text=ser.readline())
    root.after(100, update)

w = Canvas(root, width=200, height=100)
w.pack()
text_id = w.create_text(100, 50, text="")

答案 1 :(得分:0)

感谢您的帮助。 Jonrsharpe是对的。创建文本只执行一次,所以将该注释与Tobias结合,将该语句w.create_text(100,50,text = theta.get())移动到更新函数,然后我得到了我期待的内容。唯一的一个小评论是,值被覆盖了以下一个。不知道为什么。似乎新的更新值没有清除前一个值,并且在几个样本之后在GUI中无法读取值。 对我来说真的很小,因为我能够解决问题并设计我的Canvas GUI,现在已经启动并运行了。