【问题标题】:Tkinter Label referring to variable doesn't update when variable changed变量更改时,引用变量的 Tkinter 标签不会更新
【发布时间】:2019-06-02 22:25:25
【问题描述】:

当标签引用一个值并且我通过按下按钮更新该值时,我遇到了 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()

【问题讨论】:

    标签: python user-interface button tkinter


    【解决方案1】:

    欢迎来到 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()
    

    在该链接How to change label text 中,您可以找到用于更改tkinter label 小部件中文本的其他选项。 希望对你有帮助

    【讨论】:

      【解决方案2】:

      这是因为您在更新current_letter 之后没有更新标签l。简单的解决方案是将current_letter 更改为IntVar 并更新类LabelButton 如下:

      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 类,因为它不是必需的。我还将类 LabelButton 分别重命名为 MyLabelMyButton,因为它们是 tkinter 中的类。

      【讨论】:

        【解决方案3】:

        天哪,你的按钮好大啊。

        如果您使用 tkinter Variable,那么更新它会自动更改引用其中之一的任何小部件中的内容。这里有一些 documentation 描述它们,这里有一些 more 描述如何使用它们。

        以下是如何对您问题中的代码执行此操作:

        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 中的类相同有点令人困惑,因为虽然它们表面上看起来很相似,但实际上它们非常不同——这可能会导致难以理解的编程错误。

        【讨论】:

          猜你喜欢
          • 2015-11-01
          • 1970-01-01
          • 2011-02-05
          • 2020-05-04
          • 1970-01-01
          • 1970-01-01
          • 2015-05-16
          • 2022-09-23
          • 1970-01-01
          相关资源
          最近更新 更多