我正在尝试尽可能多地限制用户输入。我不知道如何将“-DAY-”和“-MONTH-”的输入限制为 2 位数字

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

这是我的布局元素

[sg.Text('DOB: dd/mm/yyyy     '),sg.InputText(key='-DAY-', size=(2,1)),sg.Text('/'),sg.InputText(key='-MONTH-',size=(2,1)),sg.Text('/'),sg.InputText(key='-YEAR-',size=(4,1))],

size 参数限制框的大小,但用户仍然可以输入任意长的数字,只是不能在窗口中看到所有数字

python layout constraints user-input pysimplegui
1个回答
0
投票

在这里通过 tkinter 代码验证

from datetime import datetime
import PySimpleGUI as sg

def validate(text, width, limit):
    w = len(text)
    if text:
        return False if (
            (w > width)          or
            (not text.isdigit()) or
            (int(text) > limit)  or
            (int(text) < 1)
        ) else True
    else:
        return True

now = datetime.now()
items = [('Year', now.year), ('Month', now.month), ('Day', now.day)]

font = ("Courier New", 16, 'bold')
sg.set_options(font=font)

layout = [[sg.Text(item, size=5), sg.Input(date, size=4, justification='center', key=item)] for item, date in items]
window = sg.Window('Title', layout, use_default_focus=False, finalize=True)
vcmd_year   = (window.TKroot.register(lambda text, width=4, limit=9999:validate(text, width, limit)), '%P')
vcmd_month  = (window.TKroot.register(lambda text, width=2, limit=  12:validate(text, width, limit)), '%P')
vcmd_day    = (window.TKroot.register(lambda text, width=2, limit=  31:validate(text, width, limit)), '%P')
window['Year' ].widget.configure(validate='all', validatecommand=vcmd_year )
window['Month'].widget.configure(validate='all', validatecommand=vcmd_month)
window['Day'  ].widget.configure(validate='all', validatecommand=vcmd_day  )

for key in ('Year', 'Month', 'Day'):
    window[key].bind("<FocusIn>", " FocusIn")

while True:

    event, values = window.read()

    if event == sg.WIN_CLOSED:
        break
    elif event.endswith("FocusIn"):
        key = event.split(" ")[0]
        window[key].update(select=True)

window.close()

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