如果全部选中并按下删除或退格按钮,则入口Tkinter不允许删除数据

时间:2014-03-14 16:11:46

标签: python tkinter widget tkinter-entry

我已经编写了一个条目小部件的代码,它不允许使用字母并将数字位数限制为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

3 个答案:

答案 0 :(得分:0)

遵循逻辑。让我们说你已经进入&#34; 987&#34;。您现在选择它并尝试删除它。在验证函数中text(当前值)将为"987"。您的代码没有为此做好准备,因此它将使第一个if语句失败。由于失败,验证返回False,不允许编辑。

您需要为Tkinter传递给函数的内容做好准备(删除时为长字符串),并且需要在编辑后明确允许空值。

答案 1 :(得分:0)

在这里回答一个较老的问题,但我遇到了一个非常相似的问题,并找到了一个不错的解决方案。 @Bryan Oakley的答案很有用,但没有提供一个例子,这是我打算在这里做的。

导入Tkintertkinter(取决于您的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中的第一个条件