获取 tkinter Entry 来验证最终状态,跳过中间删除?

问题描述 投票:0回答:1

所以如果我想将值限制在 100 到 200 之间...

import tkinter as tk

master = tk.Tk()

def validatePLZ(index, value_if_allowed):
    print("validatePLZ with index:%s and proposed value:%s" % (index, value_if_allowed))
    if int(index) > 3 or len(value_if_allowed) > 3:
        return False
    print("Not too long")
    value = int(value_if_allowed)
    print("Considering value: ", value)
    if value < 100 or value > 200:
        return False
    return True

vcmd = (master.register(validatePLZ), '%i', '%P')
ent = tk.Entry(master, validate="key", validatecommand=vcmd)
ent.insert(0, "150")
ent.pack()

tk.Button(master, text="Validate").pack()

tk.mainloop()

这在不太严格的条件下有效,允许零,但如果该值为“150”,并且我尝试通过突出显示“5”并输入“7”来更改为“170”,我看到的是:

  1. 删除“5”,结果为“10”

  2. 删除失败后添加“7”,结果为“1570”

但是它在#1 上失败了,所以它不起作用。如果只是删除一个字符,我仍然希望 #1 发生,但是如何将突出显示替换合并到一个检查中?或者我怎么知道它是突出显示替换而不是简单的删除?

python validation tkinter tkinter-entry
1个回答
0
投票

这在不太严格的条件下有效,允许零,但是 如果该值为“150”并且我尝试更改为“170” 突出显示“5”并输入“7”我看到的是:

删除“5”,结果为“10”

删除失败后添加“7”,结果为“1570”

但是它在#1 上失败了,所以它不起作用。我仍然希望#1发生 如果只是删除一个字符,但是如何突出显示替换 合并为一张支票?或者我怎么知道它是否是突出显示替换 而不是简单的删除?

问题可以解决。

  • 在第 8 行,将
    return False
    更改为
    return True
  • 在第 12 行,将
    or
    更改为
    and
    布尔值更改
    > 200
    < 200

片段:

def validatePLZ(index, value_if_allowed):
    print("validatePLZ with index:%s and proposed value:%s" % (index, value_if_allowed))
    if int(index) > 3 or len(value_if_allowed) > 3:
        return True
    print("Not too long")
    value = int(value_if_allowed)
    print("Considering value: ", value)
    if value < 100 and value < 200:
        return False
    return True

首次启动截图:

截图。将光标置于末尾并使用退格键删除:

截图。删除退格键后,您可以在调试中看到打印 15:

截图。将光标放在 5 和 0 之间并使用退格键(您可以在调试中看到)打印 10:

截图。输入5和0之间的7。在debug中可以看到打印1570:.

截图。突出显示 5 以删除。可以在debug中看到打印170:

此后,用户将无法进入

Entry
小部件。

希望,如果这是你想要的,

© www.soinside.com 2019 - 2024. All rights reserved.