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

PySimpleGUI健身会员程序:计算功能失效问题求助

健身会员费用计算功能修复方案

核心问题梳理

  • 按钮初始化错误:创建「Calculate Membership Total」按钮时直接调用计算函数,导致程序启动时就执行函数,而非点击按钮触发;同时传递的无效字符串参数无法关联用户输入。
  • 函数调用参数缺失:事件循环中点击按钮后调用函数时未传参,但函数定义要求参数,触发错误导致无响应。
  • 函数逻辑脱离用户输入:函数内部重新创建GUI控件而非读取用户实际选择;变量比较逻辑错误(如元组与字符串对比、未使用正确控件key),无法正确计算费用。
  • 事件判断匹配错误:「Submit」按钮的事件判断逻辑存在大小写不匹配问题,导致触发失败。

修正后的完整代码

import PySimpleGUI as sg

sg.theme('LightGray1')
default_color = 'dark red'

# 创建各列布局
col1 = sg.Column([
    [sg.Text("City Gym Membership Form", size=(30,1), font=('Helvetica', 30), text_color='red')],
])

col2 = sg.Column([
    [sg.Text('Customer Details:', size=(15,1), font=("Helvetica", 20), text_color='dark red')],
    [sg.Text('First Name:'), sg.InputText(key='first_name')],
    [sg.Text('Last Name:'), sg.InputText(key='last_name')],
    [sg.Text('Address:'), sg.InputText(key='address')],
    [sg.Text('Mobile Number:'), sg.InputText(key='mobile')],
])

col3 = sg.Column([
    [sg.Text('Membership Details:', font=('Helvetica', 20), text_color='dark red')],
    [sg.Text('Type of membership:')],
    [sg.Radio('Basic($10pw)', 'Radio1', default=True, key='basic'),
     sg.Radio('Regular($15pw)', 'Radio1', key='regular'),
     sg.Radio('Premium($20pw)', 'Radio1', key='premium')],
])

col4 = sg.Column([
    [sg.Text('Duration:')],
    [sg.Radio('3 months', 'Radio2', default=True, key='3months'),
     sg.Radio('12 months($2pw discount)', 'Radio2', key='twelvemonths'),
     sg.Radio('24 months($5pw discount)', 'Radio2', key='twentyfourmonths')],
])

col5 = sg.Column([
    [sg.Text('Payment Option:')],
    [sg.Text('Direct Debit(1% discount on any membership type):')],
    [sg.Radio('Yes', 'Radio3', default=True, key='dd_yes'),
     sg.Radio('No', 'Radio3', key='dd_no')],
])

col6 = sg.Column([
    [sg.Text('Frequency of payment:')],
    [sg.Radio('Weekly', 'Radio4', default=True, key='weekly'),
     sg.Radio('Monthly', 'Radio4', key='monthly')],
])

col7 = sg.Column([
    [sg.Text('Extras:', font=("Helvetica", 20), text_color='dark red')],
    [sg.Checkbox('24/7 access($1 per week)', key='access')],
    [sg.Checkbox('Personal Trainer($20 per week)', key='personal_trainer')],
    [sg.Checkbox('Diet Consultation($20 per week)', key='diet')],
    [sg.Checkbox('Access online fitness videos($2 per week)', key='videos')],
])

# 添加结果显示区域
col8 = sg.Column([
    [sg.Button('Calculate Membership Total', button_color='red', key='calculate')],
    [sg.Text('Total Cost:', font=('Helvetica', 12))],
    [sg.Text('', size=(15,1), font=('Helvetica', 16), text_color='green', key='total_result')]
])

# 整体布局
layout = [
    [col1],
    [col2, col7],
    [col3, col8, sg.Button('Submit', key='submit')],
    [col4],
    [col5],
    [col6],
]

# 创建窗口
window = sg.Window('City Gym Membership Form', layout)

def calculate_membership_total(values):
    # 计算基础会员费用
    base_cost = 0
    if values['basic']:
        base_cost = 10
    elif values['regular']:
        base_cost = 15
    elif values['premium']:
        base_cost = 20

    # 计算额外费用
    extra_cost = 0
    if values['access']:
        extra_cost += 1
    if values['personal_trainer']:
        extra_cost += 20
    if values['diet']:
        extra_cost += 20
    if values['videos']:
        extra_cost += 2

    # 计算折扣
    discount = 0
    # 时长折扣
    if values['twelvemonths']:
        discount += 2
    elif values['twentyfourmonths']:
        discount += 5
    # 直付折扣(1%)
    if values['dd_yes']:
        discount += (base_cost + extra_cost) * 0.01

    # 计算净费用(每周)
    weekly_net = base_cost + extra_cost - discount

    # 根据支付频率转换
    total = weekly_net
    if values['monthly']:
        total = weekly_net * 4  # 按每月4周计算

    return round(total, 2)

# 事件循环
while True:
    event, values = window.read()
    print(event, values)

    if event in (sg.WIN_CLOSED, 'Exit'):
        break

    if event == 'calculate':
        total_cost = calculate_membership_total(values)
        # 更新结果显示
        if values['weekly']:
            window['total_result'].update(f"${total_cost}/week")
        else:
            window['total_result'].update(f"${total_cost}/month")

    if event == 'submit':
        sg.popup('Your application has been submitted!')

window.close()

关键修改说明

  1. 按钮与事件处理:移除按钮创建时的函数调用,改为通过按钮key='calculate'在事件循环中触发计算,确保点击时才执行函数。
  2. 函数逻辑重构:函数接收values字典作为参数,直接读取用户的选择状态(如values['basic']判断是否选了基础会员),避免无效的控件创建和字符串对比。
  3. 费用计算逻辑:分步计算基础费用、额外费用、折扣,最后根据支付频率转换金额,结果保留两位小数更规范。
  4. 结果可视化:添加文本框显示计算结果,用户无需查看控制台即可看到总费用。
  5. 事件判断修正:将提交按钮的事件判断改为匹配按钮key,确保提交功能正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 03:15:04