You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在DataFrame每一行旁添加Widget按钮?

如何在DataFrame的每一行旁添加按钮?

我想要在DataFrame的每一行旁添加按钮,以下是我当前的代码:

PRO_name_list = []
c.execute("SELECT pro_name FROM PRODUCT ORDER BY pro_name ASC")
for row in c:
  PRO_name_list.append(row[0])

PRO_price_list = []
c.execute("SELECT pro_price FROM PRODUCT ORDER BY pro_name ASC")
for row in c:
  PRO_price_list.append(row[0])

PRO_id_list = []
c.execute("SELECT pro_id FROM PRODUCT ORDER BY pro_name ASC")
for row in c:
  PRO_id_list.append(row[0])

d = []
for names in PRO_name_list:
  for row in PRO_id_list:
    if PRO_name_list.index(names) == PRO_id_list.index(row):
     d.append([names, "${0:.1f}".format(PRO_price_list[PRO_name_list.index(names)])]) 
     HOM_rowHBox = widgets.HBox([HOM_addtocart_button])
     display(widgets.VBox([HOM_rowHBox]))

df = pd.DataFrame(data=d,columns=None)
display(df.style
     .hide_index()
     .hide_columns())

当前输出:
当前输出

期望效果:
期望效果

我不知道该如何实现这一需求,且在Stack Overflow上未找到能理解的类似问题,希望有人能告知实现该问题的方法。谢谢。


解决方案

你当前的代码存在几个核心问题:多次重复查询数据库效率低、嵌套循环匹配索引完全冗余、按钮和DataFrame分离显示导致无法对应每行。下面是两种可行的实现方案:

方案1:用ipywidgets直接构建带按钮的表格(推荐)

直接用组件组装行结构,让商品信息和按钮天然对应,无需依赖DataFrame:

import ipywidgets as widgets
import pandas as pd

# 优化数据库查询:一次性获取所有需要的字段
c.execute("SELECT pro_id, pro_name, pro_price FROM PRODUCT ORDER BY pro_name ASC")
product_data = c.fetchall()

# 定义按钮点击逻辑(示例:打印商品ID)
def add_to_cart(pro_id):
    print(f"已添加商品ID {pro_id} 到购物车")

# 组装每行的组件
rows = []
for pro_id, pro_name, pro_price in product_data:
    # 创建商品名称、价格标签
    name_label = widgets.Label(value=pro_name)
    price_label = widgets.Label(value=f"${pro_price:.1f}")
    # 创建绑定当前商品ID的按钮
    cart_btn = widgets.Button(description="加入购物车", button_style="success")
    cart_btn.on_click(lambda btn, pid=pro_id: add_to_cart(pid))
    # 把当前行的组件横向排列
    row_hbox = widgets.HBox([name_label, price_label, cart_btn], layout={"justify_content": "space-between", "padding": "5px 0"})
    rows.append(row_hbox)

# 把所有行纵向组装成表格样式
display(widgets.VBox(rows, layout={"border": "1px solid #eee", "padding": "10px"}))

方案2:将按钮嵌入DataFrame的HTML渲染

如果希望保留DataFrame的样式,可通过HTML渲染把按钮嵌入单元格:

from IPython.display import HTML

# 同样先一次性获取数据
c.execute("SELECT pro_id, pro_name, pro_price FROM PRODUCT ORDER BY pro_name ASC")
product_data = c.fetchall()

# 构建带按钮的HTML表格
html_content = """
<style>
.table-custom {border-collapse: collapse; width: 100%; margin: 10px 0;}
.table-custom th, .table-custom td {border: 1px solid #eee; padding: 8px; text-align: left;}
.table-custom button {background: #2ecc71; color: white; border: none; padding: 6px 12px; border-radius: 4px; cursor: pointer;}
</style>
<table class="table-custom">
    <tr><th>商品名称</th><th>价格</th><th>操作</th></tr>
"""

for pro_id, pro_name, pro_price in product_data:
    html_content += f"""
    <tr>
        <td>{pro_name}</td>
        <td>${pro_price:.1f}</td>
        <td><button onclick='addCart({pro_id})'>加入购物车</button></td>
    </tr>
    """

html_content += "</table>"

# 添加JS交互逻辑(可选,用于前端处理点击事件)
js_code = """
<script>
function addCart(pro_id) {
    console.log('添加商品ID ' + pro_id + ' 到购物车');
    // 可在此添加后端请求等逻辑
}
</script>
"""

# 渲染最终内容
display(HTML(js_code + html_content))

内容的提问来源于stack exchange,提问作者lee ho wang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:45:33