我有一个应用程序,对于其中的一部分,将采用用户的输入并将其格式化为标准化时间格式。为此,我有一个time
输入,其中绑定了一个focusout
事件,调用时间解析器/ replacer方法。然而,在测试它时,只是设置一个消息标签来输出一些东西,我注意到它只触发一次......
下面是一些显示问题的示例代码。
from Tkinter import *
root=Tk()
message_var = StringVar()
message = Label(root, textvariable=message_var, height=2, width=35, bg="light grey")
time_var = StringVar()
time = Entry(root, textvariable=time_var, validate="focusout", validatecommand=time_update)
lose_focus_var = StringVar()
lose_focus_textbox = Entry(root, textvariable=lose_focus_var)
message_var.set("Enter a time below.")
lose_focus_var.set("Click here to lose focus.")
def time_update():
"""
Updates the time field to show standardized times.
"""
cur_entry = time_var.get()
if len(cur_entry) == 0:
message_var.set("0!")
elif len(cur_entry) == 1:
message_var.set("1!")
elif len(cur_entry) == 2:
message_var.set("2!")
elif len(cur_entry) == 3:
message_var.set("3!")
elif len(cur_entry) == 4:
message_var.set("4!")
elif len(cur_entry) == 5:
message_var.set("5!")
else:
message_var.set("TOO MANY!")
time_var.set("")
message.pack()
time.pack()
lose_focus_textbox.pack()
要重现我的问题,请运行上面的代码。在出现的窗口中,单击空白文本框,输入任意数量的字符,然后单击“单击此处失去焦点”文本框。您将看到消息窗口小部件正确更新!耶!
但是,如果再次单击第一个文本框,更改字符数,然后再次单击“丢失焦点”框,则消息将不会再次更新。您需要终止窗口并重新运行消息窗口小部件的代码才能再次更新。
如果我将time_update
调用添加到其他文本框(并重构time_update
以确定哪个文本框称为它),则每个文本框都会发生一次消息更新。但只有一次。
除了销毁Entry小部件并重新创建它之外,我有没有办法重新触发<FocusOut>
事件?为什么不每次都触发?
答案 0 :(得分:2)
正如您在对自己的问题的评论中提到的那样,一个问题是您没有返回正确或错误。验证的重点是让tkinter知道它是否应该允许编辑,并根据返回值执行此操作。
然而,除此之外,主要问题是您正在更改验证功能中的窗口小部件的值。执行此操作时,tkinter将自动禁用验证。有解决方法,但您确实不应该更改验证功能中的值。如果我是用户,我会发现这种行为非常令人沮丧。
如果要在失去焦点时更改值,请考虑向<FocusOut>
添加绑定,而不是使用验证功能。