当前位置: 代码迷 >> python >> 如果全选并按下删除或退格按钮,则输入 Tkinter 不允许擦除数据
  详细解决方案

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

热度:109   发布时间:2023-06-27 21:17:18.0

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

在这里回答一个较旧的问题,但我遇到了一个非常相似的问题,最终找到了一个不错的解决方案。 @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 而且,最重要的是,它允许您删除和覆盖输入框中的任何突出显示的文本

我确信最初的问题早已不复存在,但我希望将来有人会发现这会有所帮助!

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

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

在 python 3.8 中工作。

%d == '0' -> 删除文本 | %d == '-1' -> 选择文本

import tkinter as tk
window = tk.Tk()
window.title('tkinter Entry')

def IntLength_Delay(action, key, content, value):
    return True if not action == '1' or len(value) < 7 and (content != '' and key == '0' or key in '123456789') else False

vcmd=window.register(IntLength_Delay)

txt = tk.Entry(window,width=10,validate='key',validatecommand=(vcmd,'%d','%S','%s', '%P'))
txt.grid(column=1,row=1,sticky='news')

window.mainloop()
  相关解决方案