2016-11-15 73 views
0

我想在入口和標籤小部件中使用文本變量。問題是我希望我的變量始終是四捨五入到兩位十進制數字。我認爲一個有效的方法是創建一個新類型的Tkinter變量,將其作爲格式化的str輸出,同時將真實的float值保留爲內部值。Tkinter文本變量的新類型變量

我看了看代碼的Tkinter的__init__.py幫助建立我的變量類:

class FormatDoubleVar(tk.Variable): 
    _default = 0.0 
    def __init__(self, iDecimal = 2): 
     tk.Variable.__init__(self) 
     self.decimal = iDecimal 
     self.fValue = 0 

    # convert strings back to float to save f value. 
    def set(self, iValue): 
     if isinstance(iValue, str): 
      iValue = float(iValue.replace(",","")) 
     self.fValue = round(float(iValue),self.decimal) 
     fmtstr = "{:,." + str(self.decimal) + "f}" 
     value = fmtstr.format(self.fValue) 
     return self._tk.globalsetvar(self._name, value) 

    def getValue(self): 
     return self.fValue 

然而,當我使用這個變量對我的Entry組件,我看不到訪問值我進入通過變量本身。無論我在運行程序時將其更改爲什麼,我都將回調附加到Entry中,並且指定的textvariable的值保留爲舊值。

這是一個問題,因爲我沒有正確創建類?我注意到在tkinter源代碼中,其他變量只重載「get」方法,但我需要在「set」過程中對值進行格式化。

+1

您的縮進不正確 –

+0

固定縮進 – TwoFeis

回答

0

Tkinter變量根本不是Python對象;它們完全存在於Tk託管的Tcl解釋器中。 Python端只是對Tcl變量的自動生成名稱的引用。因此,任何重寫的方法隻影響Python方法調用,而不影響底層變量。任何完全在Tcl方面完成的事情(例如鍵入具有相關文本變量的Entry小部件)都不會看到您的覆蓋。

+0

謝謝。我意識到問題在於編輯Entry小部件正在更新基礎變量 - 'self._tk.globalgetvar(self._name)' - 但沒有更新我正在使用的「fValue」變量。我必須做的是更新「getValue」方法,以從self._tk中獲取變量以訪問更改。謝謝! – TwoFeis