如何利用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
相关产品推荐
相关产品推荐

