You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

关键修改说明

  1. try-except捕获转换异常:把int()转换放在try块中,输入无法转整数时触发ValueError,进入except块执行错误提示逻辑。
  2. 修正窗口事件处理:用while True循环读取错误窗口事件,避免原代码read_all_windows()可能导致的事件混乱。
  3. 直接操作原窗口控件:清空输入框时使用janela1['t1'](''),避免窗口对象混淆。

修改后,输入非整数内容时程序会弹出错误提示窗口,不会直接崩溃,符合你的需求。


内容的提问来源于stack exchange,提问作者Renzo-M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 00:37:32