首页 > 编程语言 >python 一个简单的点餐系统

python 一个简单的点餐系统

时间:2024-06-05 22:44:36浏览次数:9  
标签:python menu self item window tk 简单 点餐 quantity

import tkinter as tk
from tkinter import messagebox
import sqlite3

class RestaurantApp:
    def __init__(self, master):
        self.master = master
        self.master.title("餐厅点餐系统")

        # 连接到数据库
        self.connection = sqlite3.connect('menu.db')
        self.cursor = self.connection.cursor()

        # 创建菜单表(如果不存在)
        self.cursor.execute('''CREATE TABLE IF NOT EXISTS menu
                               (id INTEGER PRIMARY KEY, item TEXT, price REAL)''')

        # 插入初始菜单数据(如果不存在)
        # self.cursor.execute('''INSERT OR IGNORE INTO menu (item, price) VALUES
        #                        ('汉堡', 10),
        #                        ('披萨', 15),
        #                        ('沙拉', 8),
        #                        ('可乐', 3)''')
        self.connection.commit()

        # 创建点餐列表
        self.order_items = []

        # 创建两个按钮
        self.customer_button = tk.Button(self.master, text="顾客", command=self.customer_view)
        self.customer_button.pack()

        self.employee_button = tk.Button(self.master, text="员工", command=self.employee_view)
        self.employee_button.pack()

    def customer_view(self):
        self.master.withdraw()  # 隐藏主窗口

        # 创建顾客界面
        customer_window = tk.Toplevel(self.master)
        customer_window.title("顾客界面")

        # 创建已点菜单列表框
        order_frame = tk.Frame(customer_window)
        order_frame.grid(row=0, column=0)

        tk.Label(order_frame, text="已点菜单").pack()
        order_listbox = tk.Listbox(order_frame, height=10, width=50)
        order_listbox.pack()

        # 创建删除菜品按钮
        def delete_item():
            selected_indices = order_listbox.curselection()
            if selected_indices:
                item_index = selected_indices[0]
                order_listbox.delete(item_index)
                del self.order_items[item_index]
            else:
                messagebox.showerror("错误", "请选择要删除的菜品!")

        delete_button = tk.Button(order_frame, text="删除", command=delete_item)
        delete_button.pack()

        # 从数据库中获取菜单信息
        self.cursor.execute("SELECT * FROM menu")
        menu_items = self.cursor.fetchall()

        # 创建菜单列表
        tk.Label(customer_window, text="菜单").grid(row=0, column=1)
        menu_listbox = tk.Listbox(customer_window, height=10, width=50)
        menu_listbox.grid(row=1, column=1)
        for item in menu_items:
            menu_listbox.insert(tk.END, f"{item[1]} - ¥{item[2]}")

        # 创建选择数量按钮
        def select_quantity():
            selected_indices = menu_listbox.curselection()
            if selected_indices:
                item_text = menu_listbox.get(selected_indices[0])  # 获取选定菜品文本
                item_name = item_text.split(' - ')[0]  # 提取菜品名称
                ask_quantity(item_name, order_listbox)
            else:
                messagebox.showerror("错误", "请选择一个菜品!")

        quantity_button = tk.Button(customer_window, text="选择数量", command=select_quantity)
        quantity_button.grid(row=2, column=1)

        # 创建点餐完成按钮
        def finish_order():
            # 计算总金额
            total_price = sum(self.get_item_price(item[0]) * item[1] for item in self.order_items)
            # 显示已点菜单和总金额
            order_summary = "\n".join([f"{item[0]} x{item[1]}" for item in self.order_items])
            messagebox.showinfo("已点菜单", f"您的订单如下:\n{order_summary}\n总金额:¥{total_price}")
            # 退出程序
            self.master.quit()

        finish_button = tk.Button(customer_window, text="完成点餐", command=finish_order)
        finish_button.grid(row=3, column=1)

    def get_item_price(self, item_name):
        # 根据菜品名称从数据库中获取价格
        self.cursor.execute("SELECT price FROM menu WHERE item=?", (item_name,))
        price = self.cursor.fetchone()
        return price[0] if price else 0

    def employee_view(self):
        # 创建员工登录界面
        employee_window = tk.Toplevel(self.master)
        employee_window.title("员工登录")

        tk.Label(employee_window, text="用户名:").grid(row=0, column=0)
        username_entry = tk.Entry(employee_window)
        username_entry.grid(row=0, column=1)
        tk.Label(employee_window, text="密码:").grid(row=1, column=0)
        password_entry = tk.Entry(employee_window, show="*")
        password_entry.grid(row=1, column=1)

        def login():
            username = username_entry.get()
            password = password_entry.get()
            # 这里可以添加从数据库中验证用户名和密码的逻辑
            if username == "admin" and password == "admin":
                employee_window.destroy()
                self.show_menu_management()
            else:
                messagebox.showerror("错误", "用户名或密码错误!")

        login_button = tk.Button(employee_window, text="登录", command=login)
        login_button.grid(row=2, columnspan=2)

    def show_menu_management(self):
        # 创建菜单管理界面
        management_window = tk.Toplevel(self.master)
        management_window.title("菜单管理")

        # 从数据库中获取菜单信息
        self.cursor.execute("SELECT * FROM menu")
        menu_items = self.cursor.fetchall()

        # 显示当前菜单
        tk.Label(management_window, text="当前菜单").grid(row=0, columnspan=2)
        menu_listbox = tk.Listbox(management_window, height=5, width=30)
        menu_listbox.grid(row=1, columnspan=2)
        for item in menu_items:
            menu_listbox.insert(tk.END, f"{item[1]} - ¥{item[2]}")

        # 添加菜品功能
        tk.Label(management_window, text="添加菜品").grid(row=2, column=0)
        new_item_entry = tk.Entry(management_window)
        new_item_entry.grid(row=2, column=1)
        tk.Label(management_window, text="价格").grid(row=3, column=0)
        new_price_entry = tk.Entry(management_window)
        new_price_entry.grid(row=3, column=1)

        def add_item():
            new_item = new_item_entry.get()
            new_price = new_price_entry.get()
            if new_item and new_price:
                try:
                    price = float(new_price)
                    # 将新菜品添加到数据库
                    self.cursor.execute("INSERT INTO menu (item, price) VALUES (?, ?)", (new_item, price))
                    self.connection.commit()
                    menu_listbox.insert(tk.END, f"{new_item} - ¥{price}")
                    messagebox.showinfo("成功", "菜品添加成功!")
                except ValueError:
                    messagebox.showerror("错误", "请输入有效的价格!")
            else:
                messagebox.showerror("错误", "请输入菜品名称和价格!")

        add_button = tk.Button(management_window, text="添加", command=add_item)
        add_button.grid(row=4, columnspan=2)

def ask_quantity(item_name, order_listbox):
    # 创建询问数量的窗口
    quantity_window = tk.Toplevel()
    quantity_window.title("选择数量")

    tk.Label(quantity_window, text=f"请选择{item_name}的数量:").pack()
    quantity_entry = tk.Entry(quantity_window)
    quantity_entry.pack()

    # 创建确定按钮
    def confirm_quantity():
        quantity = int(quantity_entry.get())
        # 在这里可以处理数量的逻辑,例如添加到订单中
        order_listbox.insert(tk.END, f"{item_name} x{quantity}")
        app.order_items.append((item_name, quantity))  # 将菜品添加到订单列表
        quantity_window.destroy()

    confirm_button = tk.Button(quantity_window, text="确定", command=confirm_quantity)
    confirm_button.pack()

    # 创建取消按钮
    cancel_button = tk.Button(quantity_window, text="取消", command=quantity_window.destroy)
    cancel_button.pack()

# 创建主窗口
root = tk.Tk()
app = RestaurantApp(root)
root.mainloop()

 

标签:python,menu,self,item,window,tk,简单,点餐,quantity
From: https://www.cnblogs.com/2022-yang/p/18234079

相关文章

  • 算法金 | 10 大必知的自动化机器学习库(Python)
    大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]一、入门级自动化机器学习库1.1Auto-Sklearn简介:Auto-Sklearn是一个自动机器学习库,基于Python的scikit-learn接口。它主要用于自动化机器学习的常见过程,特别是算法选......
  • Python嵌套_多条件判断
    python嵌套/多条件判断概念在条件语句里,再放条件语句if[条件1]:if[条件2]:[语句A]else:[语句B]else:[语句C]python会根据缩进判断属于哪个条件分支嵌套分支每次加四个空格练习#mood_index是0到100的整数#is_at_home为布尔值mood_index=......
  • 使用Python实现MySQL数据库备份
    数据库备份的重要性数据库备份是一项至关重要的任务,它可以帮助我们应对各种意外情况,如硬件故障、数据损坏、误操作等。通过定期备份数据库,我们可以保证数据的安全性,同时在发生意外时能够快速恢复数据,最大限度地减少业务影响和数据丢失。使用Python实现MySQL数据库备份使......
  • 【compshare】(3):使用UCloud(优刻得)的compshare算力平台,新增加SD-webui和大模型镜像,可
    关于UCloud(优刻得)旗下的compshare算力共享平台https://www.ucloud.cn/UCloud(优刻得)是中国知名的中立云计算服务商,科创板上市(股票代码:688158),中国云计算第一股,专注于提供可靠的企业级云服务,包括云服务器、云主机、云数据库、混合云、CDN、人工智能等服务。compshare......
  • python条件语句
    python条件语句目录python条件语句概念结构结构解释比较运算符实践概念通过判断条件是否满足,来决定执行的内容,就是条件语句的核心。结构if[条件]:[执行语句][执行语句]else:[执行语句][执行语句]结构解释求值出来为布尔值,True,False,作为条件,即把条件赋值为布尔值":......
  • python 直接加载egg 文件的模块
    主要作为一个简单记录参考示例文件模式importsysimportosegg_path=os.path.join(os.path.dirname(__file__),'dist','mydalong-0.1-py3.11.egg')sys.path.append(egg_path)fromdemoimportdalongdalong.login()文件夹模式......
  • python 生成uber egg 的几个工具
    有些时候我们为了方便python模块的分发,会有类似javauberjar的需求,社区已经有一些不错的可选工具,以下说明下uberegg这个工具scrapy-client中的deploy就使用了此工具,对于依赖的构建我们制定配置就可以了pythonsetup.pybdist_uberegg-rrequirements.txtpyassembly也是一......
  • 【华为OD】D卷真题100分:高矮个子排队 python代码实现[思路+代码]
    【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript【华为OD】2024年C、D卷真题集:最新的真题集题库C/C++/Java/python/JavaScript-CSDN博客 JS、C、python、Java、C++代码实现:【华为OD】D卷真题100分:高矮个子排队JavaScript代码实现[思路+代码]......
  • 【Python数据预处理系列】精通Pandas:数据清洗中的字符串分割技巧(例子:如何将籍贯列中的
    本文将深入探讨Pandas库在数据清洗中的应用,特别是字符串分割技巧。在数据分析的预处理步骤中,有效地处理和准备原始数据是至关重要的一步。我们将通过具体示例,展示如何使用Pandas中的.str.split()函数来对数据集中的字符串进行分割,进而提取所需信息。本文例子讲解如何将......
  • python 函数 形参前带*或者两个星** 收集元组或者字典,实参前带星*或者两个星** 解开序
    函数的形参前面带一个星*,代表着不定长参数,实际上是收集了不定长的实参,作为一个元组。形参前面带两个星**,代表可以接收不定长参数,并且调用该函数时实参要指定参数名,实际上是收集了一个不定键个数的字典。实参前带一个星*,表示解开当前的序列,再做为参数传递。实参前带两个星**,表示......