使用python streamlit库快速创建一个购物网站

streamlit

Streamlit 是一个基于 Python 的 Web 应用程序框架,致力于以更高效、更灵活的方式可视化数据,并分析结果。

Streamlit是一个开源库,可以帮助数据科学家和学者在短时间内开发机器学习 (ML) 可视化仪表板。只需几行代码,我们就可以构建并部署强大的数据应用程序。

功能设计

  • 商品展示
  • 商品选购
  • 加入购物车
  • 购物车结算
  • 增加新商品
  • 文件保存商品信息

函数/Page 设计

函数名说明
load_products()打开或创建存储商品信息的文件,并读取信息
save_products(products)将商品信息保存在文件中
show_products()用按钮显示所有商品信息
Select Product读取商品名和数量,传给购物车
Shopping Cart展示所有已选购商品,计算总价
Checkout计算总价,点击买单后清空购物车
Add New Product读取新商品信息,加入商品信息列表,写入文件,重新加载文件

源码

import streamlit as st
import json
import os

def load_products():
    if not os.path.exists('products.json'):
        with open('products.json', 'w') as file:
            file.write('{}')  # 创建一个空的 JSON 文件
    with open('products.json', 'r') as file:
        products = json.load(file)
    return products

def save_products(products):
    with open('products.json', 'w') as file:
        json.dump(products, file, indent=4)

# 初始化购物车
if 'shopping_cart' not in st.session_state:
    st.session_state.shopping_cart = []

# 初始化商品信息
if 'products' not in st.session_state:
    st.session_state.products = load_products()

def show_products():
    st.write("Current Products:")
    products = st.session_state.products
    product_names = list(products.keys())
    num_products = len(product_names)

    # 创建五列
    col1, col2, col3, col4, col5 = st.columns(5)

    # 在每列中显示产品信息
    for i in range(num_products):
        if i % 5 == 0:
            if col1.button(f"{product_names[i]} - ${products[product_names[i]]['price']} - {products[product_names[i]]['description']}"):
                st.session_state.shopping_cart.append((product_names[i], 1))
        elif i % 5 == 1:
            if col2.button(f"{product_names[i]} - ${products[product_names[i]]['price']} - {products[product_names[i]]['description']}"):
                st.session_state.shopping_cart.append((product_names[i], 1))
        elif i % 5 == 2:
            if col3.button(f"{product_names[i]} - ${products[product_names[i]]['price']} - {products[product_names[i]]['description']}"):
                st.session_state.shopping_cart.append((product_names[i], 1))
        elif i % 5 == 3:
            if col4.button(f"{product_names[i]} - ${products[product_names[i]]['price']} - {products[product_names[i]]['description']}"):
                st.session_state.shopping_cart.append((product_names[i], 1))
        else:
            if col5.button(f"{product_names[i]} - ${products[product_names[i]]['price']} - {products[product_names[i]]['description']}"):
                st.session_state.shopping_cart.append((product_names[i], 1))

def main():
    st.title('Welcome to the Convenience Store')
    page = st.sidebar.radio("Page", ["Select Product", "Shopping Cart", "Checkout", "Add New Product"])

    if page == "Select Product":
        show_products()
        selected_product = st.selectbox('Select a product', list(st.session_state.products.keys()), format_func=lambda x: f"{x} - ${st.session_state.products[x]['price']} - {st.session_state.products[x]['description']}")
        quantity = st.number_input('Quantity', min_value=1, max_value=10)
        if st.button('Add to cart'):
            st.session_state.shopping_cart.append((selected_product, quantity))
            st.success('Added to cart!')
            st.experimental_rerun()  # 刷新页面,更新商品信息

    elif page == "Shopping Cart":
        st.title('Shopping Cart')
        for item in st.session_state.shopping_cart:
            st.write(f"{item[0]} - Quantity: {item[1]}")
        total_cost = sum([st.session_state.products[item[0]]['price'] * item[1] for item in st.session_state.shopping_cart])
        st.write(f"Total Cost: ${total_cost}")

    elif page == "Checkout":
        st.title('Checkout')
        total_cost = sum([st.session_state.products[item[0]]['price'] * item[1] for item in st.session_state.shopping_cart])
        st.write(f"Total Cost: ${total_cost}")
        if st.button('Confirm Purchase'):
            st.success('Thank you for your purchase!')
            st.session_state.shopping_cart = []

    elif page == "Add New Product":
        st.title('Add New Product')
        new_product_name = st.text_input('Product name')
        new_product_price = st.number_input('Product price')
        new_product_description = st.text_input('Product description')
        if st.button('Add Product'):
            st.session_state.products[new_product_name] = {'price': new_product_price, 'description': new_product_description}
            save_products(st.session_state.products)  # 将新的商品信息保存到文件
            st.success('Product added successfully!')
            st.experimental_rerun()  # 刷新页面,显示新商品

if __name__ == "__main__":
    main()

运行示例

请添加图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

总结

streamlit使用非常方便简单,可以快速创建各种web应用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/213017.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

封装了一个顺滑嵌套滚动的框架

首先查看效果图 就是开始滚动的时候,上面的头部和下面的内容是 一起滚动的,但是当滚动到segment 的时候,segment 是悬停 的,下面的tableView是分区的 架构设计 我们设计一个架构,以下面的tablView为主体&#xff0…

大数据湖项目建设方案:文档全文101页,附下载

关键词:大数据解决方案,数据湖解决方案,数据治理解决方案,数据中台解决方案 一、大数据湖建设思路 1、明确目标和定位:明确大数据湖的目标和定位是整个项目的基础,这可以帮助我们确定项目的内容、规模、所…

P3 Linux应用编程:系统调用与库函数

前言 🎬 个人主页:ChenPi 🐻推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ 🔥 推荐专栏2: 《Linux C应用编程(概念类)_ChenPi的博客-CSDN博客》✨✨✨ 🛸推荐专栏3: ​​​​​​《 链表_Chen…

Kubernetes入门学习(下)

Kubernetes入门学习(下) 文章目录 Kubernetes入门学习(下)运行有状态的应用ConfigMap与SecretConfigMapSecret 卷(Volume)StatefulSet(有状态应用集)Headless Service(无头服务)Mysql主从复制Port-forward端口转发Helm参考 运行有…

Java中异常处理顺序和全局异常处理器

异常处理顺序 我们直接通过代码看下Java中异常的处理顺序。 数组越界异常属于运行时异常,被捕捉后就停止了,打印结果为数组越界了。 Test public void test2(){int[] arr new int[4];try{System.out.println(arr[5]);}catch (ArrayIndexOutOfBoundsE…

2023.12.2 关于 Spring AOP 详解

目录 Spring AOP Spring AOP 常见使用场景 AOP 组成 切面(类) 切点(方法) 通知 ​编辑 前置通知(Before) 后置通知(After) 返回通知(AfterReturning&#xff0…

【接口测试】Apifox实用技巧干货分享

前言 不知道有多少人和我有着这样相似的经历:从写程序只要不报错就不测试😊,到写了程序若是有bug就debug甚至写单元测试,然后到了真实开发场景,大哥和你说,你负责的功能模块的所有接口写完要测试一遍无误在…

C# 使用HtmlAgilityPack解析提取HTML内容

写在前面 HtmlAgilityPack是一个HTML解析类库,日常用法就是爬虫获取到内容后,先用XPath获取目标节点,再用正则进行匹配;使用XPath的目的主要是将目标节点或内容限定在一个较小的范围,如果一上来就用正则那效率肯定不…

python——进程常用功能

Python的multiprocessing模块提供了强大的并行处理能力,以下是几个功能的详细解释: join(): 在multiprocessing中,join方法用于阻塞主进程直到指定的进程终止。这对于确保所有子进程在程序结束前完成其工作是很有用的。deamon(): 在multipro…

讲一讲redis的使用

Redis(Remote Dictionary Server)是一个开源的内存数据库系统,它提供了高性能、支持多种数据结构的存储和操作,被广泛应用于缓存、消息队列、计数器、实时分析等场景。以下是Redis的使用详解,涵盖了基本概念、数据结构…

目标检测常用评价指标

1 基本概念 1.1 IOU(Intersection over Union) 1.2 TP TN FP FN 2. 各种率 3. PR曲线 4. mAP的计算 4.1 AP的计算 4.2 mAP 4.3 mAP0.5和mAP0.5:0.95 1.1 IOU(Intersection over Union) 1.2 TP TN FP FN TP(Truth Positive): 预测正类,实际正类&#x…

2022CVPR(PoseC3D):Revisiting Skeleton-based Action Recognition

Revisiting Skeleton-based Action Recognition 摘要1、引言2、相关工作3、框架3.1. 姿势提取的良好实践3.2.从2D姿势到3D热图体积3.3.基于骨架的动作识别的3D-CNN 4、实验4.2.姿势提取4.3. 3D热图体积的预处理4.4.与GCN的比较4.5. RGBPose-SlowFast4.6.与最先进的比较 5、结论…

糟了,数据库崩了,又好像没崩

前言 2023 年某一天周末,新手程序员小明因为领导安排的一个活来到公司加班,小明三下五除二,按照领导要求写了一个跑批的数据落库任务在测试环境执行 ,突然间公司停电了,小明大惊,“糟了,MySQL …

wordpress建站优化加速教程-Redis加速

这篇文章适合宝塔面板,在宝塔面板安装 Redis 实现网站加速( Redis是一个高性能的key-value数据库(PHP连接redis,需PHP设置中安装redis扩展) )。对在word press网站有着明显的加速效果。关于Redis具体说明请自己百度,…

30岁左右的简历模板精选7篇

30岁左右是职业发展的关键时期,一份出色的简历能带来更多机会。本文精选了7篇适合30岁左右求职者的专业简历案例,无论您是寻找晋升、转行还是新的职业挑战,都能从中借鉴灵感,打造一份令人印象深刻的简历。 30岁左右的简历模板下载…

Git 配置文件(.gitignore)

前言 在使用 Git 分布式版本控制系统的时候,有些文件如:数据库的一些配置文件,我们不想让这类文件在远程仓库让 Git 来管理,不想让别人看到,此时就可以自己在 Git 仓库目录下创建 / 在远程仓库创建的时候就配置好 .git…

队列顺序存储(详解)

队列是一种常见的数据结构,它是一种先进先出(First-In-First-Out, FIFO)的线性表。在队列中,数据元素按照插入的顺序排列,最先插入的元素在队列的前面,最后插入的元素在队列的后面。类比生活中排队购物的情…

调试GMS应用,报错“此设备未获得play保护机制认证”问题解决

不少同学在调试GMS相关应用时,需登录Google账号,有时会弹出如下通知。 Google登录界面也会出现如下提示 这个报错的原因是设备未通过Google认证,google服务器未配置荣耀设备的型号白名单导致 国内网页有一些指导方法在鸿蒙\荣耀的设备上消除这…

语言模型文本处理基石:Tokenizer简明概述

编者按:近年来,人工智能技术飞速发展,尤其是大型语言模型的问世,让 AI 写作、聊天等能力有了质的飞跃。如何更好地理解和利用这些生成式 AI,成为许多开发者和用户关心的问题。 今天,我们推出的这篇文章有助…

Linux环境下 make/makefile、文件时间属性 详解!!!

1.项目自动化构建工具make/makefile 1.为什么要有make/makefile 我们先写一个简单的代码,然后编译生成一个可执行程序,下面的内容我们需要知道gcc识和编译链接的一些知识,不清楚的朋友们可以点这里http://t.csdnimg.cn/0QvL8 我们知道要想生…