2019-12-24 23:52:47 +00:00
|
|
|
import PySimpleGUI as sg
|
|
|
|
|
|
|
|
'''
|
|
|
|
IP Address entry window with digit validation and auto advance
|
|
|
|
If not a digit or ., the ignored
|
|
|
|
. will advance the focus to the next entry
|
|
|
|
On the last input, once it's complete the focus moves to the OK button
|
|
|
|
Pressing spacebar with focus on OK generates an -OK- event
|
|
|
|
'''
|
|
|
|
|
|
|
|
# create a short-cut element so don't have to type this in over and over
|
|
|
|
|
|
|
|
|
|
|
|
def MyInput(key): return sg.I('', size=(3, 1), key=key, pad=(0, 2))
|
|
|
|
|
|
|
|
|
|
|
|
layout = [[sg.T('Your typed chars appear here:'), sg.T('', key='-OUTPUT-')],
|
|
|
|
[MyInput(0), sg.T('.'), MyInput(1), sg.T('.'),
|
|
|
|
MyInput(2), sg.T('.'), MyInput(3)],
|
|
|
|
[sg.B('Ok', key='-OK-', bind_return_key=True), sg.B('Exit')]]
|
|
|
|
|
|
|
|
window = sg.Window('Window Title', layout, return_keyboard_events=True)
|
|
|
|
|
|
|
|
while True: # Event Loop
|
|
|
|
event, values = window.read()
|
|
|
|
print(event)
|
2020-05-07 10:22:59 +00:00
|
|
|
if event == sg.WIN_CLOSED or event == 'Exit':
|
2019-12-24 23:52:47 +00:00
|
|
|
break
|
|
|
|
elem = window.find_element_with_focus()
|
|
|
|
|
|
|
|
if elem is not None:
|
|
|
|
key = elem.Key
|
|
|
|
# get value of input field that has focus
|
|
|
|
value = values[key]
|
|
|
|
if event == '.' and key != '-OK-': # if a ., then advance to next field
|
|
|
|
elem.update(value[:-1])
|
|
|
|
value = value[:-1]
|
|
|
|
next_elem = window[key+1]
|
|
|
|
next_elem.set_focus()
|
|
|
|
|
|
|
|
elif event not in '0123456789':
|
|
|
|
elem.update(value[:-1])
|
|
|
|
|
|
|
|
elif len(value) > 2 and key < 3: # if 2 digits typed in, move on to next input
|
|
|
|
next_elem = window[key+1]
|
|
|
|
next_elem.set_focus()
|
|
|
|
|
|
|
|
elif len(value) > 2 and key == 3:
|
|
|
|
window['-OK-'].set_focus()
|
|
|
|
print('You entered IP Address {}.{}.{}.{}'.format(*values.values()))
|
|
|
|
|
|
|
|
window.close()
|