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

PySimpleGUI计算器按钮失效+关闭报错求助(已加WIN_CLOSED判断)

问题分析与修复方案

核心问题点

  1. 按钮无响应假象:代码仅修改了result变量,但从未更新界面上的result文本元素,导致操作后无视觉反馈,误以为按钮失效。
  2. 窗口关闭报错:事件判断顺序错误,关闭窗口的事件被先执行的None分支处理,循环未终止,下一次window.read()尝试读取已关闭的窗口,触发报错。

修复步骤

1. 调整事件判断顺序

将窗口关闭的判断放在所有事件最前面,触发关闭时直接终止循环,避免后续无效操作:

while True:
    event, values = window.read()
    # 优先处理窗口关闭事件
    if event == sg.WIN_CLOSED or event is None:
        break

2. 同步更新界面显示

每次修改result后,调用window['result'].update(result)将最新值同步到界面,让操作可见:

  • 输入数字/运算符后更新
  • 计算完成(=按钮)后更新
  • 触发三角函数/开方/对数后更新
  • Clear按钮重置后更新

3. 拆分Clear按钮的处理

将Clear从关闭窗口的分支中分离,单独处理,逻辑更清晰。

修复后的完整代码

import PySimpleGUI as sg
import math

layout = [
    [sg.Text('Calculator', font=('Helvetica', 20))],
    [sg.Text('', size=(10,1), font=('Helvetica', 20), key='result')],
    [sg.Button('7', size=(5,2)), sg.Button('8', size=(5,2)), sg.Button('9', size=(5,2)), sg.Button('+', size=(5,2))],
    [sg.Button('4', size=(5,2)), sg.Button('5', size=(5,2)), sg.Button('6', size=(5,2)), sg.Button('-', size=(5,2))],
    [sg.Button('1', size=(5,2)), sg.Button('2', size=(5,2)), sg.Button('3', size=(5,2)), sg.Button('*', size=(5,2))],
    [sg.Button('0', size=(5,2)), sg.Button('.', size=(5,2)), sg.Button('=', size=(5,2)), sg.Button('/', size=(5,2))],
    [sg.Button('sin', size=(5,2)), sg.Button('cos', size=(5,2)), sg.Button('tan', size=(5,2)), sg.Button('sqrt', size=(5,2))],
    [sg.Button('log', size=(5,2)), sg.Button('Clear', size=(5,2))]
]

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

result = ''

while True:
    event, values = window.read()
    # 优先处理窗口关闭,直接终止循环
    if event == sg.WIN_CLOSED or event is None:
        break
    # 处理Clear按钮
    elif event == 'Clear':
        result = ''
        window['result'].update(result)
    # 处理数字、运算符、log输入
    elif event in ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.', '+', '-', '*', '/', 'log'):
        result += event
        window['result'].update(result)
    # 处理等于计算
    elif event == '=':
        try:
            # 替换log为math.log,确保eval能识别
            eval_result = eval(result.replace('log', 'math.log'))
            result = str(eval_result)
        except Exception as e:
            result = f'Error: {e}'
        window['result'].update(result)
    # 处理三角函数与开方
    elif event == 'sin': 
        try:
            result = str(math.sin(float(result)))
        except Exception as e:
            result = f'Error: {e}'
        window['result'].update(result)
    elif event == 'cos':
        try:
            result = str(math.cos(float(result)))
        except Exception as e:
            result = f'Error: {e}'
        window['result'].update(result)
    elif event == 'tan':
        try:
            result = str(math.tan(float(result)))
        except Exception as e:
            result = f'Error: {e}'
        window['result'].update(result)
    elif event == 'sqrt':
        try:
            result = str(math.sqrt(float(result)))
        except Exception as e:
            result = f'Error: {e}'
        window['result'].update(result)

window.close()

额外优化说明

  • 修复了log按钮的计算问题:原代码中输入log后eval无法识别,替换为math.log才能正确计算对数
  • 所有操作后都同步更新界面,确保用户能实时看到操作结果

内容的提问来源于stack exchange,提问作者laff

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 19:55:35