我正在开发一个有关数学方程式的程序,所以在我的程序中有很多条目,但是清除它们有困难。
对于输入项,我同时限制了字符数限制,并且只允许数字和(“,”)或(“。”)。如果我在输入中输入例如“ 1000”,则将其突出显示并按退格键,一切正常。但是,只要我键入“ 100,25”,然后在混音中添加逗号即可。按退格键后不会删除。
from tkinter import *
root = Tk()
def validatecontent(var):
return (var.isdigit() == bool(var)) or var == (",") or var == (".")
vcmd = (root.register(validatecontent), '%S')
def character_limit6(var):
if len(var.get()) > 0:
var.set(var.get()[:6])
var = StringVar()
entry = Entry(root, textvariable=var, validate='all',
validatecommand=vcmd)
entry.pack()
var.trace("w", lambda *args: character_limit6(var))
root.mainloop()
答案 0 :(得分:0)
编辑:似乎问题在于它拒绝识别字符串“,”或“。”,或者拒绝识别数字和“,” /“。”字符串。作为合法的。以下似乎有效:
from tkinter import *
root = Tk()
var = StringVar()
var.trace("w", lambda *args: character_limit6(var))
def validatecontent(var):
return var.isdigit() == bool(var) or "," in var or "." in var
def character_limit6(var):
if len(var.get()) > 0:
var.set(var.get()[:6])
vcmd = (root.register(validatecontent), '%S')
entry = Entry(root, textvariable=var, validate='all',
validatecommand=vcmd)
entry.pack()
root.mainloop()
答案 1 :(得分:0)
在问题中,当您删除选择时,validatecontent中的var
参数是一个字符串,例如。 “ 0,0”使您的验证例程失败。
是否只接受有效的浮点字符串? 您是否希望使用类似“ 1,234.45”或“ 123,45”的字符串?
下面我假设是“ 123,45”
在用'。'替换任何','之后,Validatecontent尝试将字符串转换为浮点型。
如果可以,则返回true,否则仅当字符串为空时才返回True。
from tkinter import *
root = Tk()
def validatecontent(var): # Amended var is now the complete string.
try:
temp = var.replace(',', '.') # Replace ','' with '.' for float conversion assumes , is decimal point.
# temp = var.replace(',',"") # Or replace , with empty if , is a thousands delimiter.
fl = float(temp)
# if temp converts to a float return length of string is less than 7
return len(var) < 7
except ValueError:
return var == "" # If it doesn't convert to a float only accept an empty string.
vcmd = (root.register(validatecontent), '%P') # '%P' passes the whole new string to validate content.
entry = Entry(root, validate='key', validatecommand=vcmd) # Validate on key only.
entry.pack()
root.mainloop()
可能存在更好的涉及正则表达式的验证功能。不过,这相当容易遵循。如果需要,该条目仍可以链接到StringVar。虽然不需要进行验证。