【问题标题】:i am not able to update the label text in tkinter in python我无法在 python 中更新 tkinter 中的标签文本
【发布时间】:2020-05-11 21:24:54
【问题描述】:

我正在尝试循环更新 tkinter 标签文本。 如果i 的值不会更新标签的文本。 下面是我的代码及其输出,任何人都可以帮助我为什么它不起作用? 提前致谢!

import tkinter as tk
import time
from tkinter import messagebox
class Test():
   def __init__(self):
       self.root = tk.Tk()
       self.v = tk.StringVar()
       self.text='yo'
       self.v.set(self.text)
       self.label = tk.Label(self.root, text=self.v.get())
       self.root.after(500,self.callback)
       self.button = tk.Button(self.root,text="RUN Timer",command=lambda:self.runtimer(5))
       self.button.pack()
       self.label.pack()
       self.root.mainloop()
   def runtimer(self,n):
       messagebox.showinfo("information","Information")  
       print(n,' value of n')
       for i in range(0,int(n)):
               print(i)
               self.text=i
               print('value of text',self.text)
               time.sleep(1)
               self.root.after(500,self.callback)
   def callback(self):
       print('in callback')
       print(self.text)
       self.v.set(self.text) 
app=Test()

在回调中
哟
n 的 5 值
0
文本值 0
1
文本 1 的值
2
文本 2 的值
3
文本 3 的值
4
文本值 4
在回调中
4
在回调中
4
在回调中
4
在回调中
4
在回调中
4

【问题讨论】:

    标签: python tkinter label


    【解决方案1】:

    问题在于您声明 Label() 标记时。 StringVar() 创建一个可以操作文本的对象。 set() 和get() 方法仅用于设置和检索值。当您调用 self.v.get() 时,您将获得 StringVar 的值。相当于设置一个静态字符串。将此通道self.v 修复为Label 为textvariable,而不是将self.v.get() 设置为text。

    更正后的代码如下所示:

    import tkinter as tk
    import time
    from tkinter import messagebox
    class Test():
       def __init__(self):
           self.root = tk.Tk()
           self.v = tk.StringVar()
           self.text = 'yo'
           self.v.set(self.text)
           self.label = tk.Label(self.root, textvariable=self.v)
           self.root.after(500, self.callback)
           self.button = tk.Button(self.root, text="RUN Timer", command=lambda:self.runtimer(5))
           self.button.pack()
           self.label.pack()
           self.root.mainloop()
    
       def runtimer(self, n):
           messagebox.showinfo("information","Information")  
           print(n, 'value of n')
           for i in range(int(n)):
               print(i)
               self.text = i
               print('value of text', self.text)
               self.callback()
               time.sleep(1)
    
       def callback(self):
           print('in callback')
           print(self.text)
           self.v.set(self.text)
           self.root.update()
    
    app=Test()
    

    【讨论】:

    • 标签文字正在更新中。但它只更新了数字 4。我仍然得到与以前相同的输出。回调方法仅在循环结束时调用。你能帮忙吗?
    • 一种有效的解决方案是直接调用self.callback() 并在调用时强制更新窗口。我更新了代码以反映这些变化。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多