购物车

# ### 购物车
import json
import time

money = 0
good_lst = [] #商品列表

# 定义一个购物车字典
car = {}
'''
car = {
1:{电脑... }
2:{鼠标...}
}
'''
with open("shopping_data.json", mode="r+", encoding="utf-8") as fp:
    for i in fp:  # 文件对象是迭代器,一次迭代一行
        dic = json.loads(i)  # 用loads一行一行序列化
        good_lst.append(dic)
print(good_lst)
"""
13
[
    0:{'name': '电脑', 'price': 1999}, 1
    1:{'name': '鼠标', 'price': 10,"account":2},   2
    2:{'name': '游艇', 'price': 20},   3
    3:{'name': '美女', 'price': 998},  4 
    4:{'name': '风油精', 'price': 30}  5
]
"""


def progress(percent):  # 用来接收传过来的百分比
    if percent > 1:
        percent = 1
    strvar = int(50 * percent) * '#'  # 设置每多少百分比显示的*
    # 用\r操作每次传过来转换后的百分比拿到前面并替换到原来的内容,%%让后面显示多少百分比%
    print("\r[%-50s] %d%%" % (strvar, int(100 * percent)), end='')


def exe_progress():
    recv_size = 0  # 定义一个接收文件大小的变量
    # 假设文件总大小是1028000
    total_size = 1028000
    while recv_size < total_size:  # 当接收文件大小小于总文件大小时
        time.sleep(0.01)  # 程序等待0.01秒
        # 一次接收的字节数是1024
        recv_size += 6000
        percent = recv_size / total_size  # 计算百分比
        progress(percent)


# 充值
def recharge():
    global money  # 声明money是全局变量,用于下面在函数内部修改这个全局变量
    while True:
        num = input("请充值吧,大哥")
        if num.isdecimal():  # 判断充值的金额是否是纯数字
            money = int(num)
            print("恭喜你~ 充值成功{}元人民币".format(money))
            break
        else:
            print("充值失败,非数字")


# 加载
def loading():
    print("加载商品中...")
    exe_progress()  # 调用进度条函数
    print()  # 换行


# 展示
def show_goods():
    strvar = "{}".format("商品名称").center(18)  # 字符串格式化让参数并让参数,其它补空格
    print("序号" + strvar + "价格")
    # 打印对应的商品
    for k, v in enumerate(goods_lst, start=1):
        print(k, v)  # 展示效果 k对应1 v对应{'name': '电脑', 'price': 1999}
        v['num'] = k  # 在v字典里面添加键值对 num = 1 ...
        strvar = "{v[num]:<10}{v[name]:<12}{v[price]}".format(v=v)  # 容器类型传参,并且填充空格,原字符串居左
        print(strvar)


# 错误提示
def error():
    strvar = """
**************************************************
*          您输入的选项不存在 , 请重新输入       *
**************************************************        
"""
    print(strvar)
    time.sleep(1)  # 打印完错误提示后 让程序停一秒


# 加入购物车
def add_car(num):  # 把序号传入进来
    if num not in car:  # 如果商品序号不在购物车中
        car[num] = {  # 购物车里面的序号是从1开始的
            "name": goods_lst[num - 1]["name"],  # 商品列表中索引是从0开始的
            "price": goods_lst[num - 1]["price"],
            "account": 1
        }
    else:
        car[num]["account"] += 1  # 如果在的话 就让数量加1
    print(car)
    """
        {
            序号: 商品描述(字典形式展现)
            2: {'name': '鼠标', 'price': 10, 'account': 1}, 
            3: {'name': '游艇', 'price': 20, 'account': 1}
        }
    """


# 展示购物车清单
def show_car(num):  # 把选择的商品序号传入
    print("*" * 50)
    print("您选择的商品具体信息:")
    print("*-商品名称:{}".format(car[num]["name"]))  # 购物车序号从1开始
    print("*-商品单价:{}".format(car[num]["price"]))
    print("*-商品数量:{}".format(car[num]["account"]))
    print("已成功添加到购物车~ 请继续shopping ~")
    print("*" * 50)


# 结算
def balance():
    total = 0
    print("[-------------------您购物车的具体商品如下:-------------------]")
    for k, v in car.items():  # 取购物车中的k和v
        print(k, v)
        v['num'] = k  # 在v字典里面添加键值对num:1 ....等
        # 计算当前商品总价格
        v['total'] = v['price'] * v['account']  # 添加键值对
        total += v['total']  # 把字典中的总价加到变量total中
        strvar = "序号{v[num]}: 商品名称:{v[name]} 商品单价:{v[price]} 商品数量:{v[account]} 此商品总价:{v[total]}".format(v=v)  # 容器类型传参
        print(strvar)
    return total  # 把总价格返回


# 成功结算函数
def success(total, money):
    print("正在结算数据中...")
    exe_progress()  # 调用进度条
    print("\n请稍后...")
    time.sleep(1)

    print("[一共:{}元]".format(total))
    print("[您已经成功购买以上所有商品 , 余额还剩{}元,感谢您下次光临~]".format(money - total))


# 充值金额小于商品结算金额,需删除调用此函数
def del_goods(total, money):
    print("余额不足,还差{}元,请忍痛割爱,删除某些商品".format(total - money))
    num = input("[-------------------请输入要删除的商品序号:-------------------]")
    # 判断是不是纯数字
    if num.isdecimal():
        # 变成数字类型
        num = int(num)
        # 判断该商品在不在购物车当中
        if num in car:
            # 数量-1
            car[num]["account"] -= 1 #对应序号的数量-1
            #如果数量变成0了,意味着要从购物车中删除商品
            if not car[num]["account"]: #car[num]["account"] = 0,if not 0=>if not False =>if True
                car.pop(num)
        else:
            error()  #商品序号不在购物车内就报错
    else:
        error()  #不是数字也报错

#退出程序
def myexit():
    print("[============== 欢迎下次光临: ==============]")
    time.sleep(1)

#主文件调用
def main():
    #1.充值
    recharge()
    #2.加载中
    loading()
    #3.展示商品
    show_goods()
    #4.开始购物
    sign = True
    while sign:
        num = input("请输入您要购买的商品:")
        #购物
        if num.isdecimal():
            num = int(num)
            if num <= len(good_lst): #限制只能输入在商品列表中的序号
                #添加购物车
                add_car(num)
                #展示购物车
                show_car(num)
            else:
                error() #不在商品列表中就报错
        #结算
        elif num.upper() == 'N':
            while True:
                #结算总价格
                total = balance()
                #print(total,money)
                #判断总价格超过实际充值,提示用户删除商品
                if total>money:
                    del_goods(total,money) #调用删除商品的函数
                else:
                    success(total,money) #调用成功结算的函数
                    sign = False
                    break
        elif num.upper() == 'Q':
            myexit()  #调退出程序函数
            sign = False
        else:
            #报错
            error()

main()  #调主文件启动程序

 

posted @ 2020-05-21 21:38  我在路上回头看  阅读(110)  评论(0编辑  收藏  举报