有边界的 Tkinter 条目

A Tkinter Entry with boundaries

目前,我正在开发 Tkinter GUI。在此 GUI 中,我想包含一个 Entry 字段,用户只能在其中输入两个边界之间的数字(例如,介于 0.0 和 200.0 之间的数字)。我查看了 validatecommand 选项,但这仍然没有为我提供解决方案。有没有人可以帮我创建一个有边界的 Tkinter Entry

提前致谢。

您可以通过.get()方法获取值,然后写一个if语句产生错误,或者在超过限制时通过.set()方法重置该值。

tkinter Entry validation 允许验证在 Entry 字段中键入的字符。 我不知道 tkinter 中内置的验证过程是否允许验证整个输入值是否在给定范围内;但是,您可以使用常见的 if-else 测试:

在以下示例中,条目中输入的每个字符的值都被验证为数字。然后,在检索到值 entry.get 后, 检查该值以确定它在所需范围内 ,并打印在控制台中;如果不是,则引发 ValueError

entry._get, entry.get = entry.get, _get_only_in_range 制作了 entry.get 的私有副本,然后猴子修补它以注入所需的行为 更好的方法可能是编写一个 class 来封装特定于您的条目的行为。

import tkinter as tk


def only_numbers(char):    # validates each character as it is entered in the entry
    if char.isdigit():
        return True
    else:
        root.bell()
        return False

def _get_only_in_range():
    num = int(entry._get())   # uses the private copy of the original entry.get
    if 0 <= num < 200:
        return num
    else:
        raise ValueError(f'value {num} must be between 0 and 200')

if __name__ == "__main__":

    root = tk.Tk()
    validation = root.register(only_numbers)
    entry = tk.Entry(root, validate="key", validatecommand=(validation, '%S'))
    entry._get = entry.get           # make private copy of original get
    entry.get = _get_only_in_range   # calling entry.get now calls _get_only_in_range to validate the value
    entry.pack()
    tk.Button(root, text='get value', command=lambda: print(entry.get())).pack()  # here get points to _get_only_in_range
    root.mainloop()