2016-07-29 91 views
0

我嘗試使用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() 

回答

1

第一個問題更改標籤文本:在構造函數初始化一個名爲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

好。請接受答案。 –

1

要設置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'