Tkinter的输入框选择全部内容并按下删除或退格键后,无法擦除数据。

2024-04-25 05:51:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经写了一个输入小部件的代码,它不允许字母表,并且将位数限制在7。但我不能在输入框中选择全部,并使用delete或backspace键删除它们,有人能帮我吗。在

我的代码段:

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

Tags: 代码textselffalsereturnifvalue部件
1条回答
网友
1楼 · 发布于 2024-04-25 05:51:58

在这里回答了一个老问题,但我遇到了一个非常相似的问题,最终找到了一个像样的解决方案。@布莱恩·奥克利的回答很有用,但没有提供一个例子,这就是我在这里要做的。在

导入Tkinter或{}(取决于Python版本)as tk之后,首先定义初始验证命令:

val_cmd = (master.register(self.validate), '%P')  # master is root in thie case.

接下来,每当你有一个需要验证的输入框时,我发现这是一个很好的写出来的方法:

^{pr2}$

这将在验证开始之前插入一个值。我最初有一些类似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楼 · 发布于 2024-04-25 05:51:58

在vcmd中传递另一个参数“%d”,并添加以下命令

#Here action is '%d'
if action == 0 or action == -1:
    return True

看看这对你有没有帮助。对于action==0,即删除文本,validate将返回true。因此你可以删除任何你想要的东西。简化版本如下:

^{pr2}$

将此行添加为vcmd中的第一个条件

网友
3楼 · 发布于 2024-04-25 05:51:58

遵循逻辑。假设你输入了“987”。现在选择它并尝试删除它。在验证函数text(当前值)将是"987"。您的代码还没有准备好,因此它将使第一个if语句失败。由于失败,验证返回False,不允许编辑。在

您需要为Tkinter传递给函数的内容做好准备(在删除的情况下是一个长字符串),并且需要在编辑之后显式地允许一个空值。在

相关问题 更多 >