我想在textvariable
和Entry
小部件中使用Label
s。问题是我希望我的变量始终是float
s四舍五入到两位小数。我认为有效的方法是创建一种新类型的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()
期间格式化值。
Tkinter变量根本不是Python对象;它们完全存在于Tk托管的Tcl解释器中。 Python方面只是对自动生成的Tcl变量名称的引用。因此,任何重写的方法只会影响Python方法调用,而不会影响基础变量。完全在Tcl端完成的任何操作(例如键入带有关联文本变量的Entry小部件)都看不到您的覆盖。