PySimpleGUI如何正确访问-IN0-输入变量执行判断与运算逻辑
PySimpleGUI 正确读取
-IN0-输入值并调用后续逻辑的方法 你读不到-IN0-值、逻辑执行异常,基本是三个原因导致的:读取时机不对(用户还没输完就取值)、没有做输入校验导致转int报错中断、存储值的变量作用域不对后续逻辑访问不到。
直接按下面的方式写即可:
完整可运行参考代码
import PySimpleGUI as sg # 原有布局无需修改 layouts = [ [ # Layout 0 [sg.Text('How many driver bits do you need? (Enter a number between 1 and 71)')], [sg.Input(key='-IN0-', expand_x=True, enable_events=True)], [sg.Text('', size=(20, 1), key='-OUTPUT0-')], [sg.Push(), sg.Button('Next >', key='Next 0')]], ] window = sg.Window('Driver Bit Config', layouts[0], finalize=True) # 在外层作用域定义存储变量,后续所有逻辑都能直接访问 valid_driver_num = 0 while True: event, values = window.read() # 关窗口直接退出 if event == sg.WIN_CLOSED: break # 输入实时校验:只允许输入数字,从源头避免非法值 if event == '-IN0-': input_content = values['-IN0-'] # 输入非数字就回退到上一个合法内容 if not input_content.isdigit() and input_content != '': window['-IN0-'].update(input_content[:-1]) # 输入数字时实时提示范围合法性 elif input_content.isdigit(): tmp_num = int(input_content) window['-OUTPUT0-'].update('Input valid' if 1<=tmp_num<=71 else 'Please enter 1-71') # 点击Next按钮时,再正式读取值、计算、传参 if event == 'Next 0': raw_input = values['-IN0-'].strip() # 兜底校验,避免空值/超范围值 if not raw_input.isdigit() or not (1 <= int(raw_input) <=71): window['-OUTPUT0-'].update('Enter valid 1-71 integer first') continue # 把合法值存入外层变量,后续任意位置都能调用 valid_driver_num = int(raw_input) file_count = valid_driver_num % 8 # 调用你的业务函数 open_output_files(file_count) # 后续切布局/走下一步逻辑直接写在这里即可 break window.close()
关键注意点
- 不要在输入框的实时触发事件里做类型转换和业务计算:用户输入过程中会出现空值、输到一半的非完整数字,直接转int会直接抛错中断程序。等用户点击
Next 0明确提交时再取值,是最稳妥的时机。 - 存储合法输入值的变量要定义在事件循环的外层,不要写在某个if事件分支的内部,否则跳出分支后其他逻辑访问不到这个变量。
- 注意模8运算的结果:如果输入值是8的整数倍,
file_count会得到0,如果你业务上需要的是1-8的文件编号,把计算逻辑改成(valid_driver_num - 1) % 8 + 1即可。 - 给输入框加实时字符过滤,不用等用户点提交才提示输入错误,交互体验更好,也能彻底避免非法输入导致的类型转换报错。
内容的提问来源于stack exchange,提问作者WoohSteezy
相关产品推荐
相关产品推荐

