这是我的布局元素
[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 参数限制框的大小,但用户仍然可以输入任意长的数字,只是不能在窗口中看到所有数字
在这里通过 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()