我已经编写了一个条目小部件的代码,它不允许使用字母并将数字位数限制为7.但我无法在输入框中选择全部并使用删除或退格键删除它们,有人可以帮助我此
我的代码段:
self.DelayLabel = ttk.Label(self)
self.DelayLabel["text"] = "timeout"
vcmd = (root.register(self.IntLength_Delay), '%P', '%S")
self.Delay = ttk.Entry(self, width = '5', validate = 'key', validatecommand = vcmd)
def IntLenght_Delay(self,value,text):
if text in '0123456789':
if len(value)<7:
return True
else:
return False
else:
return False
答案 0 :(得分:0)
遵循逻辑。让我们说你已经进入&#34; 987&#34;。您现在选择它并尝试删除它。在验证函数中text
(当前值)将为"987"
。您的代码没有为此做好准备,因此它将使第一个if语句失败。由于失败,验证返回False,不允许编辑。
您需要为Tkinter传递给函数的内容做好准备(删除时为长字符串),并且需要在编辑后明确允许空值。
答案 1 :(得分:0)
在这里回答一个较老的问题,但我遇到了一个非常相似的问题,并找到了一个不错的解决方案。 @Bryan Oakley的答案很有用,但没有提供一个例子,这是我打算在这里做的。
导入Tkinter
或tkinter
(取决于您的Python版本)as tk
后,首先定义初始验证命令:
val_cmd = (master.register(self.validate), '%P') # master is root in thie case.
接下来,每当你有一个需要验证的输入框时,我发现这是一个写出来的好方法:
self.entry = tk.Entry(your_frame_of_choice)
self.entry.insert('end', 100) # Inserts 100 as an initial value.
self.entry.config(validate='key', validatecommand=val_cmd)
在验证开始之前插入一个值。我最初有类似self.entry = tk.Entry(your_frame_of_choice, validate='key', validatecommand=val_cmd)
的东西,但是如果验证在insert
之前进行验证,我玩的验证函数的各种迭代都拒绝了插入代码。下面列出的那个并不关心,但我保持entry
代码的方式,因为我发现它更美观。
最后,实际功能:
def validate(self, input_text):
if not input_text:
return True
try:
float(input_text)
return True
except ValueError:
return False
这会检查floats
,但您可以根据需要轻松将其更改为ints
。最重要的是,它允许您删除和写入输入框中任何突出显示的文本。
我确定最初的问题早已不复存在,但我希望将来有人认为这会有所帮助!
答案 2 :(得分:0)
在vcmd中传递另一个参数'%d'并添加以下命令
#Here action is '%d'
if action == 0 or action == -1:
return True
查看是否对您有帮助。对于操作== 0,即删除文本,validate将返回true。因此,您将被允许删除任何想要的东西。简化版本可以如下:
if not action == 1:
return True
将此行添加为vcmd中的第一个条件