python代码写一个简单的选餐系统,需要其一菜单的方式进行工作,要包括信息的录入,浏览,查询,修改,删除,退出等功能,能不能对该代码进行修改而实现上述的功能



import tkinter as tk

class OrderSystem:
    def __init__(self, master):
        self.master = master
        self.master.title("食堂选餐系统")
        
        # 菜单数据
        self.menu_items = {
            "山东炒鸡": 12,
            "糖醋里脊": 5,
            "黄焖鸡": 13,
            "凉皮": 6,
            "过桥米线": 12
        }
        
        # 创建菜单列表
        self.menu_listbox = tk.Listbox(self.master)
        self.menu_listbox.pack(fill=tk.BOTH, expand=True)
        
        # 在菜单列表中显示菜品及价格
        for item, price in self.menu_items.items():
            self.menu_listbox.insert(tk.END, f"{item} - ¥{price}")
        
        # 创建订购按钮
        order_button = tk.Button(self.master, text="订购", command=self.open_order_window)
        order_button.pack()
        
        # 初始化当前订购信息
        self.current_order = {}
    
    def open_order_window(self):
        #获取选中的菜品
        selected_indices = self.menu_listbox.curselection()
        if len(selected_indices) == 0:
            return
        
        selected_item = self.menu_listbox.get(selected_indices[0])
        
        # 提取菜品名称和价格
        item, price = selected_item.split(" - ")
        price = int(price[1:])
        
        #打开订购子窗口
        order_window = tk.Toplevel(self.master)
        
        quantity_label = tk.Label(order_window, text="数量:")
        quantity_label.grid(row=0, column=0)
        
        quantity_entry = tk.Entry(order_window)
        quantity_entry.grid(row=0, column=1)
        
       
        confirm_button = tk.Button(order_window, text="确定",
                                   command=lambda: self.calculate_total_price(item, price, int(quantity_entry.get()), order_window))
        confirm_button.grid(row=1, column=0, columnspan=2)
    #计算价格
    def calculate_total_price(self, item, price, quantity, order_window):
        total_price = price * quantity

        self.current_order[item] = self.current_order.get(item, 0) + quantity
        
        price_label = tk.Label(order_window, text=f"总价:¥{total_price}")
        price_label.grid(row=2, column=0, columnspan=2)

        tk.messagebox.showinfo("订购成功", f"成功订购:{item},数量:{quantity},总价:¥{total_price}")


root = tk.Tk()
app = OrderSystem(root)
root.mainloop()
 

如何在该代码中添加录入,浏览,查询,修改,退出的功能?

  • 代码运行效果截屏图片

    img


    img


    img

  • 代码(是用函数式编程结构,半成品,仅完成了部分,您看看有没有可以参考的)
#!/sur/bin/nve python
# coding: utf-8
from os import system

'''

点餐小程序

'''

# 全局变量
mypath = r'/sdcard/Documents/'
ordered_dict = dict() # 记录已经点过的菜品及数量字典初值——空字典。
cuisine_dict = {i[0]: int(i[1]) for i in (i.split('\\') for i in open(f"{mypath}cuisine_list.txt").read().split('\n')[1:])} # 解析式生成供应菜品字典。(从磁盘文本读取菜品供应列表,格式为生成器——解析式用小括号包裹。)
#input(cuisine_dict) # 调试用语句。
clear = '\033[2J' # 清屏字符串。
error_tip = f"\n{' 输入错误!':^45}\n" #  输入错误提示信息字符串。


def main() -> None:
    ''' 主菜单 '''

    while True:
        print(clear)
        show_meanu()
        a = input(f"{'请输入选项:':>13}")

        if not a: # 直接回车,默认点菜。
            a = '1'

        if a == '1':
            order() # 点菜。
        elif a == '2':
            cancel_order() # 退菜。
        elif a == '3':
            check(table_num) # 查看已点菜。
        elif a == '4':
            background() # 转后台管理
        else:
            input(error_tip)


def background() -> None:
    ''' 后台菜单 '''
    while True:
        print(clear)
        show_backmeanu()
        a = input(f"{'请输入选项:':>13}")

        if not a: # 直接回车,默认结账。
            a = '1'

        if a == '1':
            input(f"{clear}\n{' 程序代码正在设计中…… ':~^41}\n") # 结账。
        elif a == '2':
            order() # 加菜。
        elif a == '3':
            cancel_order() # 退菜。
            exit() # 出菜。
        elif a == '4':
            showall() # 显示所有餐台点菜。
        elif a == '5':
            main() # 转前台。
        elif a == '6':
            print(f"{clear}\n{' 欢迎再次使用“点餐小程序” ':~^39}\n")
            exit()
        else:
            input(error_tip)


def show_meanu() -> None:
    ''' 主菜单显示 '''
    meanu_s = f"{clear}\n\n{'【欢迎光临本店点餐小程序】':^37}\n{'':~^50}\n\n{'请选择您需要的服务:':>14}\n"
    print(meanu_s)
    meanu_tuple = '点餐', '退菜', '查看已点菜', '后台管理'
    
    for k,i in enumerate(meanu_tuple): # 循环打印菜单选择项。
        print(f"{k + 1:>20}. {i}") # 插值字符串格式化打印菜单选择项。

    print(f"\n{'':~^50}\n")


def show_backmeanu() -> None:
    ''' 主菜单显示 '''
    meanu_s = f"{clear}\n\n{'【欢迎光临本店点餐小程序后台】':^37}\n{'':~^50}\n\n{'请选择您需要的服务:':>14}\n"
    print(meanu_s)
    meanu_tuple = '结账', '加菜', '退菜', '出菜', '前台点餐', '退出'
    
    for k,i in enumerate(meanu_tuple): # 循环打印菜单选择项。
        print(f"{k + 1:>20}. {i}") # 插值字符串格式化打印菜单选择项。

    print(f"\n{'':~^50}\n")


def show_cuisine() -> None:
    ''' 供应菜品列印 '''
    print(f"{clear}\n{' 本店特供菜品 ':~^44}\n")
    
    for k, cuisine in enumerate(cuisine_dict.items()): # 循环打印菜品信息。
        print(f"{'¥':>12}{cuisine[1]:.2f} {'-'*6} {k:>2}. {cuisine[0]}")

    print(f"\n{'(菜品选择序号,一份直接回车)':^37}\n{'~'*50}")


def order() -> None:
    ''' 点菜 '''

    while True:
        print(clear) # 打印清屏字符串清屏。
        table_num = input(f"\n{'本店餐台:1、2、3、4、5、6、7、8':^38}\n{'':~^50}\n{'请输入就餐台号:':>17}")
        if table_num not in map(str, range(1, 9)): # map(str, range(1, 9)) 相当于 ('1', '2', '3', '4', '5', '6', '7', '8') 。
            input(error_tip)
        else:
            break

    ordered_dict[table_num] = {} # 创建餐台点菜初值——空字典。
    table_ordered = {} # 点餐列表初值为空。
    cuisines = tuple(cuisine_dict.keys()) # 从供应菜品字典获取菜名列表,用元组更安全更省空间。
    
    while True: # 循环点菜,直到输入为空结束点餐。
        show_cuisine() # 显示菜品列表。
        cuisine_order = input(f"{'菜品:':>20}")

        if not cuisine_order:
            break # 输入为空,退出点餐循环,结束点餐。
        elif cuisine_order not in map(str, range(len(cuisine_dict) + 1)): # 输入超出范围,报错后继续循环。
            input(error_tip)
            continue # 显示错误提示信息后进入下一次循环。

        while True: # 份数输入正解才退出循环。
            dish = input(f"{'份数:':>20}")

            if not dish: # 一份直接回车,默认一份。
                dish = 1
                break
            elif dish.isdigit():
                dish = int(dish)                

                if dish > 2:
                    dish2 = input(f"\n{'(“确认”直接回车,修改直接输入份数)':^35}\n{'':~^50}\n{f'确认点 {dish} 份?__':>22}")

                    if not dish2.isdigit() and dish2 != '':
                        input(error_tip) # 输入错误,打印报错信息后跳转下一次循环。
                        continue
                        
                    else:
                        dish = dish if not dish2 else int(dish2)

                break
            else:
                input(error_tip) # 输入错误,打印报错信息后继续循环。

        cuisine_name = cuisines[int(cuisine_order)] # 从菜品供应列表截取菜名。
        table_ordered[cuisine_name] = dish # 将所点菜肴加入已点餐字典。

    #input(table_ordered) # 程序调试用语句。

    if table_ordered:
        ordered_dict[table_num] = table_ordered # 新点或加菜数量累加,get(key) 值为 None 时,令其为 0 ,换句话说就是 key 不在字典中,加入 key 并令其值为 0 。
        check(table_num) # 打印餐台已点菜品清单



def cancel_order() -> None:
        ''' 退菜 '''
        while True:
                check()
                a=int(input('请选择退菜(按1)或者退出退菜界面(按2):'))

                if a==1:           #进入退菜
                        key=input('客官您要退的菜品:')
                        val=int(input('要退几份:'))
                        
                        if key not in ordered_meanu.keys():
                                print('客官您还没有点过此菜')
                        else:                           #退菜
                                ordered_meanu[key]-=val
                                if ordered_meanu[key]==0:    #菜全退完从点单中除去
                                        del ordered_meanu[key]

                elif a==2:      #结束退菜
                        return 
                else:
                        print(error_tip)                    

        #return 0 # 对于 Python 函数无需返回值时,此句可以不写,函数默认返回空值 None 。


def check(table_num):
    ''' 查看已点菜单 '''
    table_ordered = ordered_dict.get(table_num, [])
    total_price = 0 # 总计初值。
    print(f"{clear}\n{'您的点菜':>9}({table_num}号桌):\n{'':~^50}\n")

    for cuisine, num in table_ordered.items():
         price = cuisine_dict.get(cuisine)
         subtotal = price * num
         total_price += subtotal
         print(f"{f'{price:.2f}':>15} × {num} = {subtotal:.2f} {'-'*4} {cuisine}") # 转字符型函数是 str 。

    total_price = f"共计:¥{total_price:.2f}"
    input(f"\n{total_price:^44}\n{'':~^50}\n")

        

def showall() -> None:
    ''' 后台查看所有餐台点菜 '''
    print(clear) # 清屏。

    for num in ordered_dict.keys():
        print(f"\n{f' {num} 号台 ':^48}\n{'':~^50}\n")
        table_ordered = ordered_dict.get(num)

        for cuisine in table_ordered.keys():
            print(f"{table_ordered.get(cuisine):>18} {'-'*6} {cuisine}")


if __name__ == '__main__':
    main()
          
    show(num) # 后台厨师查看桌餐单。
         
                     

要有界面

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7778373
  • 这篇博客你也可以参考下:Python矩阵的基本计算:创建矩阵与加减、矩阵乘法、矩阵转置、求方阵的迹、方阵的行列式计算、逆矩阵/伴随矩阵、解多元一次方程
  • 同时,你还可以查看手册:python- 定义扩展类型:已分类主题- 终结和内存释放 中的内容
  • 除此之外, 这篇博客: python函数(内置函数,自定义函数,无参数函数,带参数函数,默认参数函数,不定长参数函数)中的 案例1:打印下图中三角形 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    在这里插入图片描述

       def a():
        """此函数目的是打印出一个由‘*’组成的等腰三角形"""
        j = 10//2
        for i in range(1,10,2):
            print(' '*j,end='')
            j-=1
            print('*'*i)
    
  • 您还可以看一下 杨雅洲老师的python数据分析基础课程中的 [延伸学习]正则表达式(替换、提取、判断)小节, 巩固相关知识点
  • 以下回答来自chatgpt:

    解决方案:

    为了实现一个简单的选餐系统,我们可以按照以下步骤进行操作:

    1. 创建菜单类(Menu),用于存储菜品信息。菜品信息可以包括菜名、价格、描述等。
    2. 创建选餐系统类(OrderSystem),用于实现录入、浏览、查询、修改和删除菜品信息的功能,以及退出选餐系统。
    3. 在OrderSystem类中,定义一个菜单列表类属性(menu_list),用于存储所有菜品信息。
    4. 实现录入菜单信息的功能。在OrderSystem类中定义一个方法(add_menu)用于向菜单列表中添加菜品信息。用户可以输入菜名、价格和描述,并将其作为参数传递给add_menu方法。在方法内部,创建一个菜单对象,将用户输入的菜品信息赋值给菜单对象的属性,并将菜单对象添加到菜单列表中。
    5. 实现浏览菜单信息的功能。在OrderSystem类中定义一个方法(browse_menu)用于遍历菜单列表并打印出菜品信息。可以使用for循环遍历菜单列表,在每次迭代中打印出菜品的属性。
    6. 实现查询特定菜品信息的功能。在OrderSystem类中定义一个方法(query_menu)用于根据菜名查询菜品信息。用户可以输入菜名作为参数传递给query_menu方法。在方法内部,使用for循环遍历菜单列表,并判断菜名是否与菜单对象的菜名属性相匹配。如果匹配成功,则打印出该菜品的所有属性;如果没有匹配成功,则打印出提示信息。
    7. 实现修改菜品信息的功能。在OrderSystem类中定义一个方法(modify_menu)用于修改特定菜品的信息。用户可以输入菜名作为参数传递给modify_menu方法。在方法内部,使用for循环遍历菜单列表,并判断菜名是否与菜单对象的菜名属性相匹配。如果匹配成功,则根据用户输入的新菜品信息修改菜单对象的属性;如果没有匹配成功,则打印出提示信息。
    8. 实现删除菜品信息的功能。在OrderSystem类中定义一个方法(delete_menu)用于删除特定菜品的信息。用户可以输入菜名作为参数传递给delete_menu方法。在方法内部,使用for循环遍历菜单列表,并判断菜名是否与菜单对象的菜名属性相匹配。如果匹配成功,则从菜单列表中删除该菜单对象;如果没有匹配成功,则打印出提示信息。
    9. 实现退出选餐系统的功能。在OrderSystem类中定义一个方法(quit_system)用于退出选餐系统。用户在执行该方法时,将GAMEOVER设置为True,从而退出主循环,结束程序运行。
    10. 在程序入口处,创建OrderSystem对象,并依次调用录入、浏览、查询、修改和删除菜品信息的方法,直到用户选择退出选餐系统。

    下面是按照以上步骤修改后的代码:

    class Menu:
        def __init__(self, name, price, description):
            self.name = name
            self.price = price
            self.description = description
    
    class OrderSystem:
        menu_list = []
    
        def add_menu(self, name, price, description):
            menu = Menu(name, price, description)
            OrderSystem.menu_list.append(menu)
    
        def browse_menu(self):
            for menu in OrderSystem.menu_list:
                print("菜名: %s, 价格: %s, 描述: %s" % (menu.name, menu.price, menu.description))
    
        def query_menu(self, name):
            for menu in OrderSystem.menu_list:
                if menu.name == name:
                    print("菜名: %s, 价格: %s, 描述: %s" % (menu.name, menu.price, menu.description))
                    break
            else:
                print("找不到该菜品信息")
    
        def modify_menu(self, name, new_price, new_description):
            for menu in OrderSystem.menu_list:
                if menu.name == name:
                    menu.price = new_price
                    menu.description = new_description
                    print("菜品信息已修改")
                    break
            else:
                print("找不到该菜品信息")
    
        def delete_menu(self, name):
            for menu in OrderSystem.menu_list:
                if menu.name == name:
                    OrderSystem.menu_list.remove(menu)
                    print("菜品信息已删除")
                    break
            else:
                print("找不到该菜品信息")
    
        def quit_system(self):
            global GAMEOVER
            GAMEOVER = True
    
    if __name__ == '__main__':
        order_system = OrderSystem()
    
        while not GAMEOVER:
            print("请选择操作:")
            print("1. 录入菜单信息")
            print("2. 浏览菜单信息")
            print("3. 查询特定菜品信息")
            print("4. 修改菜品信息")
            print("5. 删除菜品信息")
            print("6. 退出选餐系统")
    
            choice = int(input())
    
            if choice == 1:
                name = input("请输入菜名: ")
                price = input("请输入价格: ")
                description = input("请输入描述: ")
                order_system.add_menu(name, price, description)
            elif choice == 2:
                order_system.browse_menu()
            elif choice == 3:
                name = input("请输入菜名: ")
                order_system.query_menu(name)
            elif choice == 4:
                name = input("请输入菜名: ")
                new_price = input("请输入新的价格: ")
                new_description = input("请输入新的描述: ")
                order_system.modify_menu(name, new_price, new_description)
            elif choice == 5:
                name = input("请输入菜名: ")
                order_system.delete_menu(name)
            elif choice == 6:
                order_system.quit_system()
    

    以上代码实现了一个简单的选餐系统,用户可以根据提示进行相应操作。录入菜单信息时需要输入菜名、价格和描述;浏览菜单信息时会打印出所有菜品的信息;查询特定菜品信息需要输入菜名,如果找到了该菜品信息,则打印出该菜品的所有属性;修改菜品信息需要输入菜名、新的价格和新的描述,如果成功修改了菜品信息,则打印出成功提示;删除菜品信息需要输入菜名,如果成功删除了菜品信息,则打印出成功提示;退出选餐系统可以选择操作6,结束程序运行。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^