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

