我有一个基于python Tkinter的GUI,我想在" read"中显示几个变量的值。单击按钮。理想情况下,这应该发生在显示更新变量的窗口中的某个帧中,而不会干扰其他具有其他功能的GUI小部件。
我遇到的问题是 - 每次点击"阅读"时,更新的变量都列在旧变量的正下方,而不是在该位置覆盖。我似乎对标签的工作以及padx,pady(标签的放置)有不正确的理解。我已粘贴下面的代码。什么应该是正确的方法,以便删除以前的数据,并将新数据粘贴到该位置?
def getRead():
#update printList
readComm()
#update display in GUI
i=0
while i < (len(printList)):
labelR2=Tk.Label(frameRead, text=str(printList[i]))
labelR2.pack(padx=10, pady=3)
i=i+1
frameRead=Tk.Frame(window)
frameRead.pack(side=Tk.TOP)
btnRead = Tk.Button(frameRead, text = 'Read', command= getRead)
btnRead.pack(side = Tk.TOP)
window.mainloop()
上面的代码在一个列类型显示中成功显示了printList的元素。但是,每次调用getRead时(单击读取按钮时),它都会附加到上一个显示。
PS - 如果有更好的方式来显示数据,除了标签小部件,那么请建议。
答案 0 :(得分:2)
问题是,每次运行getRead
时,您都在创建一组新标签。听起来你想要做的是更新现有标签的文本,而不是创建新标签。这是一种方法:
labelR2s = []
def getRead():
global labelR2s
#update printList
readComm()
#update display in GUI
for i in range(0, len(labelR2s)): # Change the text for existing labels
labelR2s[i].config(text=printList[i])
for i in range(len(labelR2s), len(printList)): # Add new labels if more are needed
labelR2s.append(Tk.Label(frameRead, text=str(printList[i])))
labelR2s[i].pack(padx=10, pady=3)
for i in range(len(printList), len(labelR2s)): # Get rid of excess labels
labelR2s[i].destroy()
labelR2s = labelR2s[0:len(printList)]
window.update_idletasks()
答案 1 :(得分:1)
我正在回答我自己的问题,修改了Brionius给出的答案,因为他的回答是引用了一个引用错误。以下代码对我来说很好。
labelR2s=[]
def getRead():
#update printList
readComm()
#update display in GUI
for i in range(0, len(printList)): # Change the text for existing labels
if (len(printList)>len(labelR2s)): # this is the first time, so append
labelR2s.append(Tk.Label(frameRead, text=str(printList[i])))
labelR2s[i].pack(padx=10, pady=3)
else:
labelR2s[i].config(text=printList[i]) # in case of update, modify text
window.update_idletasks()