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

如何利用Tkinter按钮多次执行函数,实现多数量商品Excel批量录入

批量插入多行相同商品数据的解决方案

问题背景

我用Tkinter写了一段代码,能让用户录入商品名称、采购价格、销售价格等信息并自动添加到Excel表格,但遇到个问题:当商品销量大于1时,不想让用户重复录入相同信息,该怎么实现批量插入多行相同的商品数据?当前触发添加操作的Add_Data函数代码如下:

def Add_Data(Event=None):
    workbook = load_workbook('Accounting Sheet.xlsx')
    sheet = workbook.active
    sheet.insert_rows(idx=2)
    sheet['A2'] = str(Date_Entry.get())
    sheet['B2'] = str(Shoe_Name_Entry.get())
    sheet['C2'] = str(Purchase_Price_Entry.get())
    sheet['D2'] = str(Sale_Price_Entry.get())
    RRP_Float = float(Purchase_Price_Entry.get())
    Sale_Float = float(Sale_Price_Entry.get())
    sheet['E1'] = str(Sale_Float-RRP_Float)
    Shoe_Name_Entry.delete(0, 30)
    Purchase_Price_Entry.delete(0, 6)
    Sale_Price_Entry.delete(0, 6)
    workbook.save('Accounting Sheet.xlsx')

解决方法

1. 新增销量输入控件

首先在你的Tkinter界面里加一个销量输入框,让用户输入当前商品的销售数量,示例代码:

import tkinter as tk

# 假设root是你的主窗口
root = tk.Tk()

# 原有输入框代码
Date_Label = tk.Label(root, text="日期:")
Date_Label.pack()
Date_Entry = tk.Entry(root)
Date_Entry.pack()

Shoe_Name_Label = tk.Label(root, text="商品名称:")
Shoe_Name_Label.pack()
Shoe_Name_Entry = tk.Entry(root)
Shoe_Name_Entry.pack()

Purchase_Price_Label = tk.Label(root, text="采购价格:")
Purchase_Price_Label.pack()
Purchase_Price_Entry = tk.Entry(root)
Purchase_Price_Entry.pack()

Sale_Price_Label = tk.Label(root, text="销售价格:")
Sale_Price_Label.pack()
Sale_Price_Entry = tk.Entry(root)
Sale_Price_Entry.pack()

# 新增销量输入框
Quantity_Label = tk.Label(root, text="销量:")
Quantity_Label.pack()
Quantity_Entry = tk.Entry(root)
Quantity_Entry.pack()

# 按钮绑定Add_Data函数
Add_Button = tk.Button(root, text="添加数据", command=Add_Data)
Add_Button.pack()

root.mainloop()

2. 修改Add_Data函数实现批量插入

修改函数逻辑,根据用户输入的销量循环插入对应行数的相同数据,同时处理输入异常:

from openpyxl import load_workbook

def Add_Data(Event=None):
    # 一次性获取所有输入值,避免重复调用get()
    date = Date_Entry.get().strip()
    shoe_name = Shoe_Name_Entry.get().strip()
    purchase_price = Purchase_Price_Entry.get().strip()
    sale_price = Sale_Price_Entry.get().strip()
    
    # 处理销量输入:默认1,非数字或负数也设为1
    try:
        quantity = int(Quantity_Entry.get().strip()) if Quantity_Entry.get().strip() else 1
        quantity = max(quantity, 1)
    except ValueError:
        quantity = 1

    # 打开Excel文件
    workbook = load_workbook('Accounting Sheet.xlsx')
    sheet = workbook.active

    # 循环插入对应行数的数据
    for _ in range(quantity):
        # 每次在第2行插入新行,保证新数据排在表头下方
        sheet.insert_rows(idx=2)
        # 填充数据
        sheet['A2'] = date
        sheet['B2'] = shoe_name
        sheet['C2'] = purchase_price
        sheet['D2'] = sale_price
        # 计算利润,修正原代码中E1的错误(会覆盖表头),改为对应行的E2
        if purchase_price and sale_price:
            try:
                profit = float(sale_price) - float(purchase_price)
                sheet['E2'] = str(profit)
            except ValueError:
                sheet['E2'] = ""  # 价格输入无效时留空

    # 清空所有输入框,用tk.END更通用
    Date_Entry.delete(0, tk.END)
    Shoe_Name_Entry.delete(0, tk.END)
    Purchase_Price_Entry.delete(0, tk.END)
    Sale_Price_Entry.delete(0, tk.END)
    Quantity_Entry.delete(0, tk.END)

    # 保存文件
    workbook.save('Accounting Sheet.xlsx')

关键说明

  • 循环插入时始终在第2行操作,每次插入后原有行会自动下移,确保所有新数据都排在表头下方;
  • 增加了输入合法性检查,避免因无效输入导致程序崩溃;
  • 修正了原代码中sheet['E1']的错误,原代码会覆盖第1行内容,改为对应插入行的E2列;
  • 使用tk.END代替固定数值清空输入框,适配不同长度的输入内容。

内容的提问来源于stack exchange,提问作者Ruibin Wu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 08:54:21