Tkinter textvariables的新型变量?

时间:2016-11-15 19:53:13

标签: python tkinter

我正在尝试在textvariableEntry小部件中使用Label。问题是我希望我的变量总是float舍入为两位小数。我认为有效的方法是创建一种新类型的Tkinter Variable,它将以格式化的str输出,同时将真正的float值保留为内部值。

我查看了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的值。我将回调附加到Entry,并且textvariable分配的值仍然是我的旧值,无论我在运行程序时将其更改为什么。

这是一个问题,因为我没有正确创建类吗?我在tkinter源代码中注意到其他变量只会重载get()方法,但我也需要在set()期间格式化值。

1 个答案:

答案 0 :(得分:1)

Tkinter变量根本不是Python对象;它们完全存在于Tk托管的Tcl解释器中。 Python方面只是对自动生成的Tcl变量名称的引用。因此,任何重写的方法只会影响Python方法调用,而不会影响基础变量。完全在Tcl端完成的任何事情(例如输入带有关联文本变量的Entry小部件)都看不到你的覆盖。