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工具完成打包,步骤如下:
- 安装PyInstaller:
pip install pyinstaller
- 执行打包命令(假设脚本文件名为
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
相关产品推荐
相关产品推荐

