gpt4 book ai didi

python - 如何使 Tkinter 条目焦点验证不仅仅在第一次发生?

转载 作者:行者123 更新时间:2023-12-01 05:10:50 25 4
gpt4 key购买 nike

我有一个应用程序,它的一部分将接受用户的输入并将其格式化为标准化时间格式。为此,我有一个 time具有 focusout 的输入与其绑定(bind)的事件调用时间解析器/替换器方法。然而,在测试它并设置消息标签来输出一些内容时,我注意到它只触发一次......

下面是一些示例代码来显示该问题。

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 以找出哪个文本框调用了它),每个文本框都会发生一次消息更新。但只有一次。

有没有办法让我重新触发 <FocusOut>事件,除了销毁 Entry 小部件并重新创建它之外?为什么不是每次都触发?

最佳答案

正如您在对自己的问题的评论中提到的,一个问题是您没有返回 True 或 False。验证的全部目的是让 tkinter 知道它是否应该允许编辑,并且它根据返回值来执行此操作。

然而,除此之外,主要问题是您正在验证函数中更改小部件的值。当您这样做时,tkinter 将自动禁用验证。有解决方法,但您确实不应该更改验证函数中的值。如果我是用户,我会发现这种行为非常令人沮丧。

如果您想在失去焦点时更改该值,请考虑将绑定(bind)添加到 <FocusOut>而不是使用验证函数。

关于python - 如何使 Tkinter 条目焦点验证不仅仅在第一次发生?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24268503/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com