2016-11-15 13 views
0

EntryおよびLabelウィジェットでtextvariablesを使用しようとしています。問題は、変数を常に2桁の小数点以下を四捨五入して浮動小数点にすることです。これを行う有効な方法は、真の浮動小数点値を内部値として保持しながら、フォーマットされたstrとして出力する新しいタイプのTkinter変数を作成することだと考えました。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 

私は私のエントリウィジェットのために、この変数を使用する場合しかし、私は値にアクセスするために見ることができません私は変数自体を通してエントリーに入ります。私はエントリーへのコールバックを添付し、割り当てられたtextvariableの値は、私がプログラムを実行するときに何を変更しても、私の古い値のままです。

私はクラスを正しく作成しなかったので、これは問題ですか?私はtkinterのソースコードで、他の変数は "get"メソッドだけをオーバーロードすることに気づいていますが、 "set"時にも値をフォーマットする必要があります。

+1

インデントが正しくありません –

+0

固定インデント – TwoFeis

答えて

0

Tkinter変数はPythonオブジェクトではありません。 Tkが内部でホストされているTclインタプリタ内に完全に存在します。 Python側は、自動的に生成されたTcl変数の名前への参照に過ぎません。したがって、オーバーライドされたメソッドは、Pythonのメソッド呼び出しにのみ影響し、基になる変数には影響しません。 Tcl側で完全に行われたもの(関連するtextvariableを持つEntryウィジェットに入力するなど)には、オーバーライドは表示されません。

+0

ありがとうございました。 Entryウィジェットを編集すると、基本変数 'self._tk.globalgetvar(self._name)'が更新されていたのですが、使用していた「fValue」変数を更新していないという問題が発生しました。私がしなければならなかったことは、 "getValue"メソッドを更新して、変数をself._tkからpullして変更にアクセスすることでした。ありがとう! – TwoFeis

関連する問題