簡體   English   中英

當變量更改時,引用變量的Tkinter標簽不會更新

[英]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並更新類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因為它們是MyButton中的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM