使用PySimpleGUI开发计算器:非整数输入时如何实现错误提示
PySimpleGUI计算器输入非整数时的错误处理问题
问题描述
我正在使用PySimpleGUI开发计算器,希望当输入框内容不是整数时弹出错误提示,而非让程序直接关闭(生成exe后)。但在VSCode运行时出现错误,以下是我的代码及报错信息:
原代码
if window == janela1 and events == 'Calcular Resultados': op = ipt['f'] te1 = int(ipt['t1']) te2 = int(ipt['t2']) tc1 = ipt['t1'] check1 = isinstance(tc1, int) if check1 == False: def erro404(): er4 = [ [sg.Text('Estes campo devem ser preenchidos com numeros')], [sg.Button('Fechar programa'), sg.Button('Voltar')] ] return sg.Window('MathMatrix', er4, finalize=True) janela1.hide() janela8 = erro404() window7, eventos6, ipt7 = sg.read_all_windows() if window7 == janela8 and eventos6 == 'Voltar': window['t1']('') window['t2']('') window['f']('') janela8.hide() janela1.un_hide() if window7 == janela8 and eventos6 == 'Fechar programa': break
报错信息
Traceback (most recent call last): File "c:\Meus_Projetos\MathMatrix\main.py", line 69, in te1 = int(ipt['t1']) ^^^^^^^^^^^^^^ ValueError: invalid literal for int() with base 10: 'rr'
注:ipt为输入控件,我是编程初学者,代码可能存在不足。
解决方案
你的核心问题是在检查输入合法性之前就强行执行了int()转换,一旦输入非数字字符串,转换会直接抛出ValueError导致程序崩溃,根本走不到后面的错误提示逻辑。另外,isinstance(tc1, int)完全无效——PySimpleGUI输入框返回的永远是字符串类型,这个判断永远为False。
正确做法是用try-except捕获转换异常,在转换失败时弹出错误窗口。修改后的代码如下:
if window == janela1 and events == 'Calcular Resultados': op = ipt['f'] try: # 尝试将输入转换为整数 te1 = int(ipt['t1']) te2 = int(ipt['t2']) # 转换成功后,在这里编写你的计算逻辑 # ... except ValueError: # 转换失败时弹出错误窗口 def erro404(): er4 = [ [sg.Text('Estes campo devem ser preenchidos com numeros')], [sg.Button('Fechar programa'), sg.Button('Voltar')] ] return sg.Window('MathMatrix', er4, finalize=True) janela1.hide() janela8 = erro404() # 循环处理错误窗口的事件 while True: window7, eventos6 = janela8.read() if window7 == janela8: if eventos6 == 'Voltar': # 清空原窗口的输入框 janela1['t1']('') janela1['t2']('') janela1['f']('') janela8.close() janela1.un_hide() break elif eventos6 == 'Fechar programa' or eventos6 == sg.WIN_CLOSED: janela8.close() janela1.close() break
关键修改说明
try-except捕获转换异常:把int()转换放在try块中,输入无法转整数时触发ValueError,进入except块执行错误提示逻辑。- 修正窗口事件处理:用
while True循环读取错误窗口事件,避免原代码read_all_windows()可能导致的事件混乱。 - 直接操作原窗口控件:清空输入框时使用
janela1['t1'](''),避免窗口对象混淆。
修改后,输入非整数内容时程序会弹出错误提示窗口,不会直接崩溃,符合你的需求。
内容的提问来源于stack exchange,提问作者Renzo-M
相关产品推荐
相关产品推荐

