【问题标题】:Validating Input Value - PySimpleGUI验证输入值 - PySimpleGUI
【发布时间】:2021-11-01 12:16:32
【问题描述】:

我有一个简单的 GUI,有两个输入和退出按钮。输入的 default_value = 0.00。我想以输入只能是浮点格式、'.2f' 和

import PySimpleGUI as sg

layout = [[sg.Input(key='first_input', enable_events=True, default_text='0.00')],
          [sg.Input(key='second_input', enable_events=True, default_text='0.00')],
          [sg.Button('Exit')]]

window = sg.Window('Main', layout)

while True:
    event, values = window.read()
    if event in ['Exit', sg.WIN_CLOSED]:
        break
    if event == 'first_input' and values['first_input']:
        try:
            in_as_float = float(values['first_input'])
            if float(values['first_input']) > 5:
                window['first_input'].update('5')
        except:
            if len(values['first_input']) == 1 and values['first_input'][0] == '-':
                continue
            window['first_input'].update(values['first_input'][:-1])

window.close()

但是当用户删除“first_input”的内容并决定填充“second_input”时,前一个仍然为空。如何防止它,例如当用户将输入留空时恢复默认值。

我尝试过做类似的事情:

if values['first_input'] == '':
   window['firs_input'].update['0.00']

但这不起作用,因为它不会让用户删除内容。例如当他想从 3 更改为 4 时,他立即删除 3 个 0.00 后。

【问题讨论】:

  • 请澄清您的具体问题或提供其他详细信息以准确突出您的需求。正如目前所写的那样,很难准确地说出你在问什么。

标签: python pysimplegui


【解决方案1】:

尝试通过正则表达式验证值,也许您可​​以测试它是否满足所有要求。

import re
import PySimpleGUI as sg

def select(element):
    element.Widget.select_range(0, 'end')
    element.Widget.icursor('end')

def validate(text):
    result = re.match(regex, text)
    return False if result is None or result.group() != text else True

regex = "^[+-]?([0-5](\.(\d{0,2}))?)?$"
old = {'IN1':'0.00', 'IN2':'0.00'}
validate_inputs = ('IN1', 'IN2')

layout = [
    [sg.Input('0.00', enable_events=True, key='IN1')],
    [sg.Input('0.00', enable_events=True, key='IN2')],
    [sg.Button('Exit')],
]

window = sg.Window('Title', layout, finalize=True)
select(window['IN1'])
for key in validate_inputs:
    window[key].bind('<FocusIn>',  ' IN')
    window[key].bind('<FocusOut>', ' OUT')

while True:
    event, values = window.read()
    if event in ['Exit', sg.WIN_CLOSED]:
        break
    elif event in validate_inputs:
        element, text = window[event], values[event]
        if validate(text):
            try:
                v = float(text)
                if v > 5:
                    element.update(old[event])
                    continue
            except ValueError as e:
                pass
            old[event] = text
        else:
            element.update(old[event])
    elif event.endswith(' IN'):
        key = event.split()[0]
        element, text = window[key], values[key]
        select(element)
    elif event.endswith(' OUT'):
        key = event.split()[0]
        element, text = window[key], values[key]
        try:
            v = float(text)
            element.update(f'{v:.2f}')
        except ValueError as e:
            element.update('0.00')

window.close()

【讨论】:

  • 谢谢!它现在完全按照我的意愿工作。您的代码中有很多有趣的行我可以从中学习。干杯!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多