我正在尝试在textvariable
和Entry
小部件中使用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()
期间格式化值。
答案 0 :(得分:1)
Tkinter变量根本不是Python对象;它们完全存在于Tk托管的Tcl解释器中。 Python方面只是对自动生成的Tcl变量名称的引用。因此,任何重写的方法只会影响Python方法调用,而不会影响基础变量。完全在Tcl端完成的任何事情(例如输入带有关联文本变量的Entry小部件)都看不到你的覆盖。