tkinter 允许空输入并触发更新函数的浮点条目 validatecommand 和trace_add

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

仅将浮点数输入或粘贴到

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("")
对象?
    

python validation tkinter tkinter-entry
1个回答
0
投票
tk.Entry

中的浮点数除了

Entry
之外还有一些边缘情况。 如果涉及负数,则需要接受“-”。如果“.123”是有效的“.”必须被接受。 如果接受指数,则必须接受“{valid-decimal}E”和“{valid-decimal}e-”。
""

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