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

Python动态菜单应用开发问题:Excel导入、OneDrive共享及打包exe

动态菜单应用问题解决方案

1. 从Excel导入数据到menu_dictionary

先在Excel文件(比如命名为MenuItems.xlsx)中设置两列:Item(商品名称)和Price(对应价格),然后用pandas读取并转换为字典,替换原代码中硬编码的menu_dictionary:

# 替换原有的menu_dictionary定义
EXCEL_MENU_FILE = 'MenuItems.xlsx'  # 专门存储菜单数据的Excel文件
menu_df = pd.read_excel(EXCEL_MENU_FILE)
menu_dictionary = dict(zip(menu_df['Item'], menu_df['Price']))

应用启动时会自动加载Excel内的菜单数据,无需硬编码维护。

2. 无需修改代码更新商品价格

直接维护MenuItems.xlsx文件即可:修改商品名称、价格,或是新增条目,下次启动应用会自动读取最新数据。如果需要实时更新(不用重启应用),可以在界面添加"刷新菜单"按钮,点击时重新读取Excel:

# 在layout中添加刷新按钮
[sg.Button("刷新菜单")]

# 在事件循环中处理刷新逻辑
if event == "刷新菜单":
    menu_df = pd.read_excel(EXCEL_MENU_FILE)
    menu_dictionary = dict(zip(menu_df['Item'], menu_df['Price']))
    sg.popup("菜单已更新")

3. OneDrive托管实现多设备同步

将MenuItems.xlsx放入OneDrive本地同步文件夹(Windows默认路径为C:\Users\[你的用户名]\OneDrive),然后修改代码中的文件路径为OneDrive同步路径:

# Windows下OneDrive示例路径
EXCEL_MENU_FILE = r'C:\Users\YourUsername\OneDrive\MenuItems.xlsx'
# 若应用也放在OneDrive文件夹内,可直接用相对路径
# EXCEL_MENU_FILE = 'MenuItems.xlsx'

OneDrive会自动将文件同步到云端,其他设备登录同一账号完成同步后,应用即可读取最新菜单数据。

4. 打包为.exe文件

使用PyInstaller工具完成打包,步骤如下:

  1. 安装PyInstaller:
pip install pyinstaller
  1. 执行打包命令(假设脚本文件名为menu_app.py):
pyinstaller --onefile --windowed menu_app.py
  • --onefile:生成单个独立的.exe文件
  • --windowed:运行时不显示命令行窗口(适配GUI应用场景)

注意:打包完成后,需将MenuItems.xlsx与.exe文件放在同一目录(或保持OneDrive路径不变);若出现依赖缺失,可通过--hidden-import参数手动补全缺失的库。


修改后的完整代码

import PySimpleGUI as sg
import pandas as pd

# 从OneDrive同步的Excel文件加载菜单数据
EXCEL_MENU_FILE = r'C:\Users\YourUsername\OneDrive\MenuItems.xlsx'
EXCEL_ORDERS_FILE = 'MenuTest1.xlsx'

# 初始化菜单字典,文件不存在时用默认值兜底
try:
    menu_df = pd.read_excel(EXCEL_MENU_FILE)
    menu_dictionary = dict(zip(menu_df['Item'], menu_df['Price']))
except FileNotFoundError:
    menu_dictionary = {
        "Cheese": 0.50,
        "Sandwhich": 1.75,
        "Pickles": 0.25,
        "Hot Dog": 1.25,
        "Burger": 3.5,
        "Onions": 0.75,
        "Bacon": 1.25,
        "Eggs": 1.00,
        "Fries": 1.25,
        "Chips": 1.25,
        "Salad": 1.25,
        "Potatoes": 1.25,
        "Ranch": 1.25,
        "Ketchup": 1.25,
        "BBQ": 1.25,
        "Drinks": 1.25,
    }
    sg.popup("未找到菜单文件,使用默认菜单")

Total = 0
items = []
Name = ''
sg.theme("DarkTeal9")

# 读取订单存储文件,不存在则创建空表格
try:
    df = pd.read_excel(EXCEL_ORDERS_FILE)
except FileNotFoundError:
    df = pd.DataFrame(columns=['Name', 'Site', 'Breakfast', 'Lunch', 'Dinner', 'Items', 'Total'])

layout = [
    [sg.Text("Welcome to the MAF Menu ")],
    [sg.Text('Name'), sg.InputText(key='Name'), sg.Text('Site'),
     sg.Combo(["A01", "B01", "C01", "D01", "E01", "F01", "G01", "H01", "I01", "J01", "K01", "L01", "M01", "N01", "O01"],
              key='Site')],
    [sg.Text("Total:"), sg.InputText('$' + str(Total), key='Cost', size=5)],
    [sg.Text('Meal Time'),
     sg.Checkbox('Breakfast', key='Breakfast'),
     sg.Checkbox('Lunch', key='Lunch'),
     sg.Checkbox('Dinner', key='Dinner')],
    [sg.Text("Entrees"), sg.Button("Burger"), sg.Button("Sandwhich"), sg.Button("Hot Dog"), sg.Button("Eggs")],
    [sg.Text("Toppings"), sg.Button("Onions"), sg.Button("Pickles"), sg.Button("Cheese")],
    [sg.Text("Sides"), sg.Button("Fries"), sg.Button("Chips"), sg.Button("Salad"), sg.Button("Potatoes")],
    [sg.Text('Condiments'), sg.Button("Ranch"), sg.Button("Ketchup"), sg.Button("BBQ")],
    [sg.Text("Beverages"), sg.Button("Drinks")],
    [sg.Button("Review"), sg.Multiline(key='New', size=(20, 5))],
    [sg.Button("刷新菜单"), sg.Submit(), sg.Button("Clear"), sg.Exit()],
]

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


def clear_input():
    global Total, items, Name
    Total = 0
    items = []
    Name = ''
    # 清空指定输入控件
    for key in ['Name', 'Site', 'Cost', 'New', 'Breakfast', 'Lunch', 'Dinner']:
        window[key]('')
    window['Cost'].update('$' + str(Total))


while True:
    event, values = window.read()

    if event == 'Clear':
        clear_input()

    if event == sg.WIN_CLOSED or event == "Exit":
        break

    if event == 'Submit':
        Name = values['Name']
        order_data = {
            'Name': Name,
            'Site': values['Site'],
            'Breakfast': values['Breakfast'],
            'Lunch': values['Lunch'],
            'Dinner': values['Dinner'],
            'Items': ', '.join(items),
            'Total': Total
        }
        df = pd.concat([df, pd.DataFrame([order_data])], ignore_index=True)
        df.to_excel(EXCEL_ORDERS_FILE, index=False)
        sg.popup('Data Stored')
        clear_input()

    if event == "Review":
        Name = values['Name']
        order = ", ".join(items)
        review_text = f"{Name} 的订单: {order}\n总价: ${Total:.2f}"
        window['New'].update(review_text)

    if event in menu_dictionary:
        Total += menu_dictionary[event]
        if event not in items:
            items.append(event)
        window['Cost'].update(f'${Total:.2f}')

    if event == "刷新菜单":
        try:
            menu_df = pd.read_excel(EXCEL_MENU_FILE)
            menu_dictionary = dict(zip(menu_df['Item'], menu_df['Price']))
            sg.popup("菜单已成功更新")
        except Exception as e:
            sg.popup(f"更新失败: {str(e)}")

window.close()

内容的提问来源于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.01 10:17:23