从变量更新 Tkinter 标签
Posted
技术标签:
【中文标题】从变量更新 Tkinter 标签【英文标题】:Update Tkinter Label from variable 【发布时间】:2011-02-05 21:16:10 【问题描述】:我编写了一个 Python 脚本,它执行一些生成任务,然后不断更改一些存储为字符串变量的文本。这行得通,每次更改时我都可以打印字符串。
我可以让标签第一次显示字符串,但它永远不会更新。
这是我的代码:
from tkinter import *
outputText = 'Ready'
counter = int(0)
root = Tk()
root.maxsize(400, 400)
var = StringVar()
l = Label(root, textvariable=var, anchor=NW, justify=LEFT, wraplength=398)
l.pack()
var.set(outputText)
while True:
counter = counter + 1
outputText = result
outputText = result
outputText = result
if counter == 5:
break
root.mainloop()
标签将显示Ready
,但不会更新以将其更改为稍后生成的字符串。
经过相当多的谷歌搜索和浏览本网站上的答案后,我认为解决方案可能是使用update_idletasks
。每次更改变量后,我都尝试将其放入,但没有帮助。
【问题讨论】:
Making python/tkinter label widget update?的可能重复 【参考方案1】:只有进入主循环后才会显示该窗口。因此,您不会看到您在 while True
块中在 root.mainloop()
行之前所做的任何更改。
GUI 界面通过在主循环中对事件做出反应来工作。这是一个 StringVar 也连接到 Entry 小部件的示例。当您更改 Entry 小部件中的文本时,它会在 Label 中自动更改。
from tkinter import *
root = Tk()
var = StringVar()
var.set('hello')
l = Label(root, textvariable = var)
l.pack()
t = Entry(root, textvariable = var)
t.pack()
root.mainloop() # the window is now displayed
我喜欢以下参考:tkinter 8.5 reference: a GUI for Python
这是您尝试做的一个工作示例:
from tkinter import *
from time import sleep
root = Tk()
var = StringVar()
var.set('hello')
l = Label(root, textvariable = var)
l.pack()
for i in range(6):
sleep(1) # Need this to slow the changes down
var.set('goodbye' if i%2 else 'hello')
root.update_idletasks()
root.update
进入事件循环,直到Tcl
处理完所有未决事件。
【讨论】:
谢谢。因此,如果我理解正确,如果我将 mainloop 放在 While True 块之前,标签将立即显示以在该块执行之前开始。但是它不会根据 While True 块中的内容进行更新,因为它位于主循环之外,对吗?无论如何,它似乎不是...... 由于字符数限制,分成 2 个 cmets 那么我需要做什么呢?似乎如果我将 mainloop 放在 While True 块之前,则不会显示 While True 块中的任何内容......而如果我把它放在之后,它会在显示之前完成块中的所有事情......我需要一些中间立场。我可以多次编写 mainloop 吗?比如,每次我希望显示更新之后? 嗯,试过了,还是不行。我想每次我想要更新时我都可以复制整个东西......就像,关闭旧标签并在它的位置制作一个新标签,而不是担心保留一个并更新它......但这似乎是一个处理事情的方式很混乱。 我的第二个例子有帮助吗? 您应该避免致电update
,除非您确定它的作用。相反,请致电update_idletasks
。前者导致所有事件都被处理,后者只处理“空闲”任务,例如重绘窗口。当您调用update
时,您正在创建一个新的嵌套事件循环,这可能很危险。我已经修改了答案以调用正确的方法。【参考方案2】:
也许我不理解这个问题,但这是我的简单解决方案 -
# I want to Display total heads bent this machine so I define a label -
TotalHeadsLabel3 = Label(leftFrame)
TotalHeadsLabel3.config(font=Helv12,fg='blue',text="Total heads " + str(TotalHeads))
TotalHeadsLabel3.pack(side=TOP)
# I update the int variable adding the quantity bent -
TotalHeads = TotalHeads + headQtyBent # update ready to write to file & display
TotalHeadsLabel3.config(text="Total Heads "+str(TotalHeads)) # update label with new qty
我同意标签不会自动更新,但可以使用
<label name>.config(text="<new text>" + str(<variable name>))
只需要在变量更新后将其包含在您的代码中即可。
【讨论】:
【参考方案3】:这是最简单的,只需定义一个 Function ,然后定义一个 Tkinter Label & Button 。按下按钮更改标签中的文本。定义标签时的不同之处在于使用文本变量而不是文本。代码已经过测试并且可以运行。
from tkinter import *
master = Tk()
def change_text():
my_var.set("Second click")
my_var = StringVar()
my_var.set("First click")
label = Label(mas,textvariable=my_var,fg="red")
button = Button(mas,text="Submit",command = change_text)
button.pack()
label.pack()
master.mainloop()
【讨论】:
以上是关于从变量更新 Tkinter 标签的主要内容,如果未能解决你的问题,请参考以下文章