Tkinter textvariables的新型变量?

问题描述 投票:0回答:1

我想在textvariableEntry小部件中使用Labels。问题是我希望我的变量始终是floats四舍五入到两位小数。我认为有效的方法是创建一种新类型的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()期间格式化值。

python tkinter
1个回答
1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.