Tkinter计算器无法更新标签

问题描述:

我尝试使用tkinter制作一个简单的整数符号计算器。它有两个不同的功能类。第二个功能应该在用户按下“Enter”按钮时启动。当我运行代码时,窗口就会按照它的设想出现。但是当我输入并点击“Enter”时,第二个功能无法运行,并且不会更新标签。我希望它更新为“此数字为正数”,“此数字为0”或“此数字为负数”。相反,它保持空白。Tkinter计算器无法更新标签

我怀疑这是相关的,但我在PyCharm社区版5.0.4中制作了这个程序,而且我使用的是Python 3.5(32位)。

import tkinter 

class IntegerSign: 

    def __init__(self): 
     self.window = tkinter.Tk() 
     self.window.title("Integer Sign Calculator") 
     self.window.geometry("300x150") 

     self.number_frame = tkinter.Frame(self.window) 

     self.solution_frame = tkinter.Frame(self.window) 
     self.button_frame = tkinter.Frame(self.window) 

     self.number_label = tkinter.Label(self.number_frame, text="Enter an integer:") 
     self.number_entry = tkinter.Entry(self.number_frame, width=10) 
     self.number_label.pack(side='left') 
     self.number_entry.pack(side='left') 

     self.statement = tkinter.StringVar() 
     self.solution_label = tkinter.Label(self.solution_frame, textvariable=self.statement) 

     self.statement = tkinter.Label(self.solution_frame, textvariable=self.statement) 

     self.solution_label.pack(side='left') 

     self.calc_button = tkinter.Button(self.button_frame, text='Enter', command=self.calc_answer) 
     self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.window.destroy) 

     self.calc_button.pack(side='left') 
     self.quit_button.pack(side='left') 

     self.number_frame.pack() 
     self.solution_frame.pack() 
     self.button_frame.pack() 

     tkinter.mainloop() 

    def calc_answer(self): 
     self.number = int(self.number_entry.get()) 
     self.statement = tkinter.StringVar() 

     if self.number > 0: 
      self.statement = "This number is positive." 
     elif self.number == 0: 
      self.statement = "This number is 0." 
     else: 
      self.statement = "This number is negative." 
IntegerSign() 

第一个问题更改标签文本:在构造函数初始化一个名为self.statement到STRINGVAR变量,然后再初始化标签。在第二次初始化之后,您无法访问第一个对象。你需要使用两个不同的名字。

第二个问题:在你的事件处理程序,calc_answer,您创建一个名为self.statement新的对象,而是需要set一个新值到旧的(见docs)。这里是你的节目的修改版本,按预期工作:

import tkinter 

class IntegerSign: 

    def __init__(self): 
     self.window = tkinter.Tk() 
     self.window.title("Integer Sign Calculator") 
     self.window.geometry("300x150") 

     self.number_frame = tkinter.Frame(self.window) 

     self.solution_frame = tkinter.Frame(self.window) 
     self.button_frame = tkinter.Frame(self.window) 

     self.number_label = tkinter.Label(self.number_frame, text="Enter an integer:") 
     self.number_entry = tkinter.Entry(self.number_frame, width=10) 
     self.number_label.pack(side='left') 
     self.number_entry.pack(side='left') 

     self.solution_string = tkinter.StringVar() 
     self.solution_label = tkinter.Label(self.solution_frame, textvariable=self.solution_string) 

     self.statement = tkinter.Label(self.solution_frame, textvariable=self.solution_string) 

     self.solution_label.pack(side='left') 

     self.calc_button = tkinter.Button(self.button_frame, text='Enter', command=self.calc_answer) 
     self.quit_button = tkinter.Button(self.button_frame, text='Quit', command=self.window.destroy) 

     self.calc_button.pack(side='left') 
     self.quit_button.pack(side='left') 

     self.number_frame.pack() 
     self.solution_frame.pack() 
     self.button_frame.pack() 

     tkinter.mainloop() 

    def calc_answer(self): 
     self.number = int(self.number_entry.get()) 

     if self.number > 0: 
      self.solution_string.set("This number is positive.") 
     elif self.number == 0: 
      self.solution_string.set("This number is 0.") 
     else: 
      self.solution_string.set("This number is negative.") 
IntegerSign() 

此代码的工作,但含有一种不好的做法,我建议你解决。函数tkinter.mainloop()本质上是一个无限循环,并且您已将它放在构造函数中。因此,构造函数不会返回构造函数通常应该使用的方式。从__init__函数中取出该语句,并在IntegerSign的调用之后将其放在最后,并将其作为将来使用的模式。

+0

谢谢。现在它可以工作。 –

+0

好。请接受答案。 –

要设置StringVar的值,您需要使用set方法。 现在你所做的只是重新分配变量。您也可以在初次初始化时为其设置一个字符串的默认值。例如 - var = tk.StringVar(value="some value")

编辑:没有看到,你也设置self.statement是标签小部件...这将工作,如果你在这个答案的底部一直使用该方法,并忽略(可选) stringvar完全。但是,当你这样做的时候,你可以把它看成粘滞便笺。您粘贴了一个便条,上面写着“这个变量保存了这个值”,然后您将这个变量重新分配给另一个粘滞便笺,该便笺上写着“它现在拥有这个值”,这是一个非常松散的视觉比喻。

>>> import tkinter as tk 
>>> root = tk.Tk() 
>>> statement = tk.StringVar() 
>>> type(statement) 
>>> <class 'tkinter.StringVar'> 
>>> statement = "This number is positive" 
>>> type(statement) 
>>> <class 'str'> 
>>> statement = tk.StringVar() 
>>> statement.set("This number is positive") 
>>> statement.get() 
'This number is positive' 
>>> type(statement) 
>>> <class 'tkinter.StringVar'> 

或者你可能只是做label_widget['text'] = 'new_text'