Python 删除内容时tkinter抛出属性错误的自定义浮点条目
当我试图定义一个只接受浮动的自定义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
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
的正确本能,但您的实现存在严重缺陷。