Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Tkinter标签表示变量不';变量更改时不更新_Python_User Interface_Button_Tkinter - Fatal编程技术网

Python Tkinter标签表示变量不';变量更改时不更新

Python Tkinter标签表示变量不';变量更改时不更新,python,user-interface,button,tkinter,Python,User Interface,Button,Tkinter,当标签引用某个值时,我遇到tkinter问题,我按下按钮更新该值。该值确实已更新,但引用该值的标签文本未更新 如何更改此代码,使按钮更新值,并更新引用此值的标签并显示在根目录中 import tkinter root = Tk() root.title('Test Button') root.geometry('600x450') class Letter: def __init__(self, value): self.value = value class

当标签引用某个值时,我遇到tkinter问题,我按下按钮更新该值。该值确实已更新,但引用该值的标签文本未更新

如何更改此代码,使按钮更新值,并更新引用此值的标签并显示在
根目录中

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。首先,您不需要在程序中为label和button创建单独的类。您可以在主类中创建它们作为
tkinter
widgets。然后,如果要传递某个类的实例的变量,则需要初始化它并正确地传递给
update\u 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标签
小部件中找到更改文本的其他选项。
我希望这会有所帮助

欢迎来到Stackoverflow。首先,您不需要在程序中为label和button创建单独的类。您可以在主类中创建它们作为
tkinter
widgets。然后,如果要传递某个类的实例的变量,则需要初始化它并正确地传递给
update\u 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标签
小部件中找到更改文本的其他选项。
我希望它能帮助我,你的按钮真大

如果使用tkinter
变量
,则更新该变量将自动更改引用其中一个变量的任何小部件中的内容。这里有一些描述它们,还有一些描述如何使用它们

下面是如何处理您问题中的代码:

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

我的,您的按钮太大了

如果使用tkinter
变量
,则更新该变量将自动更改引用其中一个变量的任何小部件中的内容。这里有一些描述它们,还有一些描述如何使用它们

下面是如何处理您问题中的代码:

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

这是因为在更新了
当前字母后,您没有更新标签
l
。简单的解决方案是将
当前字母
更改为
IntVar
,并更新class
标签
按钮
,如下所示:

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)

请注意,我已经删除了类
字母
,因为它不是必需的。我还将class
Label
Button
分别重命名为
MyLabel
MyButton
,因为它们是tkinter中的类。

这是因为在更新
当前字母后,您没有更新标签
l
。简单的解决方案是将
当前字母
更改为
IntVar
,并更新class
标签
按钮
,如下所示:

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)
请注意,我已经删除了类
字母
,因为它不是必需的。我还将class
Label
Button
分别重命名为
MyLabel
MyButton
,因为它们是tkinter中的类