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

PySimpleGUI订单系统问题:无法存储用户名与选品及OneDrive保存需求

餐品订单系统问题解决方案

完整修复代码

import PySimpleGUI as sg

# 定义餐品与对应价格
MENU = {
    "Burger": 9.99,
    "Onions": 1.99,
    "Bacon": 2.49,
    "Eggs": 1.79
}

# 用字典存储用户订单(用户名作为键,订单详情作为值)
orders = {}

# 构建GUI布局
layout = [
    [sg.Text("用户名:"), sg.Input(key="-USER-")],
    [sg.Text("选择餐品:")],
    *[[sg.Checkbox(item, key=f"-ITEM-{item}")] for item in MENU.keys()],
    [sg.Button("Order"), sg.Button("Save to OneDrive"), sg.Button("Exit")],
    [sg.Text("", key="-OUTPUT-", size=(60, 2))]
]

window = sg.Window("餐品订单系统", layout)

while True:
    event, values = window.read()
    
    if event == sg.WIN_CLOSED or event == "Exit":
        break
    
    # 处理下单逻辑
    if event == "Order":
        username = values["-USER-"].strip()
        if not username:
            window["-OUTPUT-"].update("请输入用户名!")
            continue
        
        # 获取选中的餐品
        selected_items = [item for item in MENU if values[f"-ITEM-{item}"]]
        if not selected_items:
            window["-OUTPUT-"].update("请至少选择一种餐品!")
            continue
        
        # 计算订单总价
        total = round(sum(MENU[item] for item in selected_items), 2)
        
        # 将订单关联存储到字典
        orders[username] = {
            "items": selected_items,
            "total": total
        }
        
        # 生成要求格式的输出文本
        items_str = "、".join(selected_items)
        output_text = f"{username}的订单:{items_str}。总计:${total:.2f}"
        window["-OUTPUT-"].update(output_text)
    
    # 处理保存到OneDrive逻辑
    if event == "Save to OneDrive":
        if not orders:
            window["-OUTPUT-"].update("暂无订单可保存!")
            continue
        
        # 替换为你的OneDrive实际路径(Windows默认路径示例)
        save_path = "C:/Users/你的用户名/OneDrive/订单记录.txt"
        
        try:
            with open(save_path, "w", encoding="utf-8") as f:
                for user, order_info in orders.items():
                    items_str = "、".join(order_info["items"])
                    f.write(f"{user}的订单:{items_str}。总计:${order_info['total']:.2f}\n")
            window["-OUTPUT-"].update("订单已成功保存到OneDrive!")
        except Exception as e:
            window["-OUTPUT-"].update(f"保存失败:{str(e)}")

window.close()

问题拆解与解决说明

1. 用户名无法存入列表的问题

原问题多因变量作用域错误或未正确获取输入值:

  • 将订单存储字典orders定义在循环外,避免每次点击按钮重置数据;
  • 通过values["-USER-"].strip()获取输入框内容,同时增加空值校验,防止存入无效用户名。

2. 用户名与餐品关联存储(字典用法)

用嵌套字典实现一对一关联:

  • 外层字典键为用户名,值为包含items(选中餐品列表)和total(总价)的子字典;
  • 每次点击Order时,直接将用户的订单详情更新到字典中,结构清晰易维护。

3. 生成指定格式的订单文本

通过字符串拼接与格式化实现需求:

  • 用"、".join(selected_items)将餐品列表转为中文分隔的字符串;
  • 用f-string格式化输出,:.2f确保总价保留两位小数,完全匹配要求格式。

4. 保存到OneDrive文件

  • 替换代码中的save_path为你的OneDrive实际路径(Windows默认路径为C:/Users/你的用户名/OneDrive/);
  • 用with open()上下文管理器写入文件,自动处理资源释放;
  • 增加异常捕获,处理路径错误、权限不足等问题,给出明确反馈。

5. 列表无法填充的报错解决

原报错多因未正确初始化列表或控件key不匹配:

  • 改用字典存储订单,避免列表操作的混乱;
  • 控件key采用规范命名(如-USER-、-ITEM-餐品名称),确保能正确获取对应值,避免key不存在的错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 00:01:14