验证tk中的时间码.输入小部件



我有以下代码,只允许输入有效的时间码,但我不能自己输入冒号(尽管我想这样做)。一旦我输入了三个数字,并且第三个数字被自动替换为冒号,验证就会完全停止,我可以继续输入我想要的东西,因为验证不再工作。这个错误的原因是什么?

runtime_label = tk.Label(metadata_window, text="Runtime (01:30:20:10):", background=GUI_BG_COLOR,
foreground=GUI_TEXT_COLOR)
runtime_label.pack(padx=0, pady=8)
self.runtime_entry = tk.Entry(metadata_window, background="#333333", foreground=GUI_TEXT_COLOR, width=42,
textvariable=runtime_var, validate="key")
self.runtime_entry.pack()
validate_runtime_entry_command = metadata_window.register(self.validate_runtime_entry)
self.runtime_entry.config(validatecommand=(validate_runtime_entry_command, '%S'))
def validate_runtime_entry(self, input):
time_str = self.runtime_entry.get().strip()
if input.isdigit() and len(time_str.replace(':', '')) < 8:
# Add colon after every two digits
if len(time_str.replace(':', '')) in [2, 4, 6]:
self.runtime_entry.insert(len(time_str), ':')
return False  # force revalidation to check new format
return True
elif input == 'b':
return True
else:
try:
# Check format first
datetime.datetime.strptime(time_str, '%H:%M:%S:%f')
# Then check if it's a valid time
h, m, s, f = map(int, time_str.split(':'))
if not (0 <= h <= 23 and 0 <= m <= 59 and 0 <= s <= 59 and 0 <= f <= 47):
raise ValueError
return True
except ValueError:
return False

我试图改变函数和减少(冒号),但我从来没有得到期望的结果,只有一个时间码可以输入。

如果验证函数抛出错误,它会自动禁用验证。您需要确保验证函数总是返回TrueFalse

同样,验证仅为验证而设计。您不应该在验证函数中修改小部件。这是tkinter自动禁用验证功能的另一种情况。

规范的tcl/tk文档是这么说的:

一般来说,-文本变量和- - - - - -validatecommand混合选项可能很危险。已经克服了任何问题,以便使用-validatcommand不会干扰条目小部件的传统行为。使用-文本变量对于只读目的永远不会引起问题。当您尝试设置-文本变量时,危险就来了。validatcommand将不接受,这导致-validate-invalidcommand不会被触发)。当计算-validatcommand出错时也会发生同样的情况.

首先,当-validatcommand时将会出现错误或者——invalidcommand在执行或validatcommand时,在脚本中遇到错误不返回有效的Tcl布尔值。——验证选项也会在从-validatcommand编辑条目小部件时将自身设置为none或者-invalidcommand. 这样的版本将覆盖被验证的版本。如果您希望在验证期间编辑条目小部件(例如将其设置为{}),并且仍然具有-validate选项集,您应该包含命令

相关内容

  • 没有找到相关文章