仅将浮点数输入或粘贴到
tk.Entry
(允许空字段除外),然后触发传递更新值的操作。这应该具有普遍性。
import tkinter as tk
def float_validation(inStr,acttyp): #check for float
if acttyp == '1':
try:
float(inStr)
return True
except ValueError:
return False
#Do NOT evaluate actype == '0' (delete action)
#Using acttype == '0', try:float("") returns False
return True
def update_from_entry(entry): #address empty string after float validation
if not entry.get() == "":
vals[strs.index(entry)].set(float(entry.get()))
else:
vals[strs.index(entry)].set(0)
def calculate(entry): #do something after entry update
update_from_entry(entry)
calculated_value.set(entry1_val.get()+entry2_val.get())
root = tk.Tk()
strs = [] #create lists of objects to index against each other
vals = []
entry1_str = tk.StringVar(value='0.123')
strs.append(entry1_str)
entry1_str.trace_add('write',lambda a,b,c, entry=entry1_str: calculate(entry))
entry1_input = tk.Entry(root, textvariable=entry1_str, validate='all')
entry1_input.grid(row=0,sticky='ew')
entry1_input['validatecommand'] = entry1_input.register(float_validation),'%P','%d'
entry1_val = tk.DoubleVar(value = float(entry1_str.get()))
vals.append(entry1_val)
entry2_str = tk.StringVar(value='0.456')
strs.append(entry2_str)
entry2_str.trace_add('write',lambda a,b,c,entry=entry2_str:calculate(entry))
entry2_input = tk.Entry(root, textvariable=entry2_str, validate='all')
entry2_input.grid(row=1,sticky='ew')
entry2_input['validatecommand'] = entry1_input.register(float_validation),'%P','%d'
entry2_val = tk.DoubleVar(value = float(entry2_str.get()))
vals.append(entry2_val)
calculated_value = tk.DoubleVar(value=entry1_val.get()+entry2_val.get())
output = tk.Label(root, textvariable=calculated_value).grid(row=2,sticky='ew')
root.mainloop()
代码可以工作,但是是否过度设计?通过引入额外的步骤来解决来自
tk.Entry
的空 tk.Entry
验证,同时触发更新,这是将 False
限制为浮点数的合理方法吗?我是否误解了如何允许空(和/或粘贴到)float("")
对象?tk.Entry
中的浮点数除了
Entry
之外还有一些边缘情况。
如果涉及负数,则需要接受“-”。如果“.123”是有效的“.”必须被接受。 如果接受指数,则必须接受“{valid-decimal}E”和“{valid-decimal}e-”。""