从变量更新Tkinter标签

37 投票
3 回答
235266 浏览
提问于 2025-04-15 21:23

我写了一个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来解决这个问题。我试着在每次变量改变后加上这个,但并没有帮助。

3 个回答

3

这个方法是最简单的。你只需要定义一个函数,然后创建一个Tkinter的标签和按钮。当你按下按钮时,标签中的文字会改变。定义标签时,有一点不同,就是要用文本变量而不是直接用文本。代码已经测试过,可以正常运行。

    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()
9

也许我没有完全理解这个问题,但这是我简单的解决办法,能够正常工作 -

# 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>))

来更新。只需要在变量更新之后把这个加到你的代码里就行。

41

窗口只有在进入主循环后才会显示。所以在你写的 while True 循环中,直到 root.mainloop() 这一行之前所做的任何更改都是看不到的。


图形用户界面(GUI)是通过在主循环中响应事件来工作的。这里有一个例子,展示了一个字符串变量(StringVar)是如何和一个输入框(Entry widget)连接的。当你在输入框中更改文本时,标签(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 参考: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 处理完毕。

撰写回答