Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 删除内容时tkinter抛出属性错误的自定义浮点条目_Python_Python 3.x_Tkinter - Fatal编程技术网

Python 删除内容时tkinter抛出属性错误的自定义浮点条目

Python 删除内容时tkinter抛出属性错误的自定义浮点条目,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,当我试图定义一个只接受浮动的自定义tkinter条目小部件时,为什么会出现一个DoubleVar没有属性\u report\u exception错误 当我删除entry小部件的内容以输入新的浮点数时,就会发生这种情况 除了将tk.StringVar()更改为tk.DoubleVar()之外,我尝试按照文档中的示例进行操作,它们看起来完全相同 使用自定义条目小部件的示例: self.depth_label = tk.Label(self, text="Maximum Depth") self.d

当我试图定义一个只接受浮动的自定义tkinter条目小部件时,为什么会出现一个
DoubleVar没有属性\u report\u exception
错误

当我删除entry小部件的内容以输入新的浮点数时,就会发生这种情况

除了将tk.StringVar()更改为tk.DoubleVar()之外,我尝试按照文档中的示例进行操作,它们看起来完全相同

使用自定义条目小部件的示例:

self.depth_label = tk.Label(self, text="Maximum Depth")
self.depth_label.grid(row=1, column = 1)
self.depth_entry = FloatEntry(self, default=255.0)
self.depth_entry.grid(row=1, column = 2)
自定义条目类

class FloatEntry(tk.Entry):

    def __init__(self, master, default=0.0, **kwargs):

        tk.Entry.__init__(self, master, **kwargs)
        self.default = default
        self.value = self.default
        self.float = tk.DoubleVar()
        self.float.set(self.value)
        self.float.trace("w", self.__callback)
        self.config(textvariable=self.float)

    def __callback(self, *dummy):
        value = self.float.get()
        new_value = self.validate(value)
        if new_value is None:
            self.float.set(self.default)
        elif new_value != value:
            self.value = new_value
            self.float.set(self.new_value)
        else:
            self.value = value

    def validate(self, value):
        try:
            if value:
                value = float(value)
            return value
        except ValueError:
            return None

删除条目中的最后一个字符时会出现问题。输入值变为空字符串,因为您已将
entry
小部件绑定到
DoubleVar
,tkinter将尝试将值转换为double,并且将失败,因为空字符串不是有效的浮点数

至少有两种解决方案。一种是将
条目
小部件绑定到
StringVar
,然后可以添加代码来处理小部件为空的特殊情况


另一种解决方案是使用内置的条目小部件验证代码,以防止小部件具有无效的浮点值。关于stackoverflow如何使用验证功能,这里有一个冗长的答案:。

您应该使用
validatecommand
来检查条目的输入并根据该输入返回值

import tkinter

def validate(action, index, value_if_allowed,
                       prior_value, text, validation_type, trigger_type, widget_name):
    text = entry.get()
    if text in '0123456789':
        try:
            float(value_if_allowed)
            return True
        except ValueError:
            return False
    else:
        return False

window = tkinter.Tk()

entry = tkinter.Entry(window)
vcmd = (window.register(validate),'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')

entry.configure(validate="key", validatecommand=vcmd)

entry.pack()

window.mainloop()

这是行不通的。如果用户输入字符串“3.14”,如果“0123456789”中有文本,则测试将失败。。因此,函数将返回false。另外,当您调用
entry.get()
时,它将在编辑之前返回值。您有使用
validatecommand
的正确本能,但您的实现存在严重缺陷。