[英]Tkinter Label referring to variable doesn't update when variable changed
当标签引用一个值并且按下按钮更新该值时,tkinter出现了问题。 该值确实已更新,但引用该值的标签文本未更新。
如何更改此代码,使按钮更新值,并且引用该值的标签已更新并显示在root
?
import tkinter
root = Tk()
root.title('Test Button')
root.geometry('600x450')
class Letter:
def __init__(self, value):
self.value = value
class Label:
def __init__(self, master):
self.a_label = tkinter.Label(root, text=current_letter.value)
self.a_label.grid(row=2, column=1)
class Button:
def __init__(self, master):
self.Button1 = tkinter.Button(master, height = 12, width = 24,
command= self.update_letter)
self.Button1.grid(row=1, column=1)
def update_letter(self):
current_letter.value
print("current_letter.value before: " + str(current_letter.value))
current_letter.value += 1
print("current_letter.value now: " + str(current_letter.value))
root.update
#initialize a
a = Letter(0)
current_letter = a
b = Button(root)
l = Label(root)
root.mainloop()
欢迎使用Stackoverflow。 首先,您实际上不需要在程序中为标签和按钮创建单独的类。 您可以在主类内部将它们创建为tkinter
小部件。 然后,如果要传递某个类的实例的变量,则需要对其进行初始化,并正确传递给update_letter
函数,可以使用lambda
。 这是您可以使用的示例代码:
import tkinter as tk
class UpdateLabel:
def __init__(self, master):
self.master = master
# Create instance of Letter class
a = Letter(value=0)
current_letter = a
self.update_button = tk.Button(master, text='Update', command=lambda:self.update_letter(current_letter))
self.update_button.grid(row=0, column=0)
self.label = tk.Label(master, text='No Value')
self.label.grid(row=1, column=0)
def update_letter(self, current_letter):
print("current_letter.value before: " + str(current_letter.value))
current_letter.value += 1
print("current_letter.value now: " + str(current_letter.value))
self.label.configure(text='Value: {}'.format(current_letter.value))
class Letter:
def __init__(self, value):
self.value = value
if __name__ == '__main__':
root = tk.Tk()
app = UpdateLabel(master=root)
root.mainloop()
在该链接如何更改标签文本中 ,您可以在tkinter label
小部件中找到其他用于更改文本的选项。 希望对您有所帮助
我的,您的按钮很棒。
如果您使用tkinter Variable
,则对其进行更新将自动更改引用其中一个的所有小部件中的内容。 下面是一些文档描述它们,和这里的一些更多的描述了如何使用它们。
这是对问题代码的处理方式:
import tkinter
root = tkinter.Tk()
root.title('Test Button')
root.geometry('600x450')
class Letter:
def __init__(self, value):
self.value = tkinter.IntVar(value=value) # Store in a tkinter Variable.
class Label:
def __init__(self, master, letter):
self.a_label = tkinter.Label(master, textvariable=letter.value)
self.a_label.grid(row=2, column=1)
class Button:
def __init__(self, master, letter):
self.letter = letter
self.Button1 = tkinter.Button(master, height=12, width=24,
command=self.update_letter)
self.Button1.grid(row=1, column=1)
def update_letter(self):
current_value = self.letter.value.get()
print("letter.value before: " + str(current_value))
self.letter.value.set(self.letter.value.get() + 1)
print("letter.value now: " + str(self.letter.value.get()))
# initialize a
a = Letter(0)
b = Button(root, a)
l = Label(root, a)
root.mainloop()
注释:我发现自己的类与tkinter
的类相同,这有点令人困惑,因为尽管它们从表面上看起来很相似,但实际上却截然不同,这可能导致难以理解的编程错误。
这是因为在更新current_letter
之后,您没有更新标签l
。 简单的解决方案是将current_letter
更改为IntVar
并更新类Label
和Button
,如下所示:
class MyLabel:
def __init__(self, master):
self.a_label = tkinter.Label(root, textvariable=current_letter)
self.a_label.grid(row=2, column=1)
class MyButton:
def __init__(self, master):
self.Button1 = tkinter.Button(master, height = 12, width = 24,
command= self.update_letter)
self.Button1.grid(row=1, column=1)
def update_letter(self):
value = current_letter.get()
print("current_letter.value before: ", value)
value += 1
print("current_letter.value now: ", value)
current_letter.set(value)
current_letter = tkinter.IntVar(0)
b = MyButton(root)
l = MyLabel(root)
请注意,由于没有必要,我删除了Letter
类。 我还将Label
和Button
类分别重命名为MyLabel
和MyButton
因为它们是MyButton
中的类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.