从变量更新 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 标签的主要内容,如果未能解决你的问题,请参考以下文章

每当有来自串行端口 python 3.x 的新数据时,从串行数据更新 tkinter 标签

使用 Tkinter 按下按钮后更新标签 [重复]

从tkinter标签中删除花括号

Python Tkinter 从标签中删除/删除图像

如何更新 Tkinter 标签小部件的图像?

Python / Tkinter:使用按钮更新类变量