问题描述
我已经为输入小部件编写了一个代码,它不允许使用字母并将位数限制为 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
1楼
在这里回答一个较旧的问题,但我遇到了一个非常相似的问题,最终找到了一个不错的解决方案。 @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楼
遵循逻辑。
假设您输入了“987”。
您现在选择它并尝试删除它。
在您的验证函数text
(当前值)中,将是"987"
。
您的代码尚未为此做好准备,因此第一个 if 语句将失败。
由于失败,验证返回 False,不允许编辑。
您需要为 Tkinter 传递给您的函数的内容做好准备(删除时为长字符串),并且您需要在编辑后明确允许空值。
3楼
在 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()