import tkinter as tk
import openpyxl
from tkinter import messagebox
from tkinter import ttk
import datetime
import pandas as pd
庫存=r"\物料庫存.xlsx"
比對=r"\庫存單價\單價表.xlsx"
class InventoryApp:
def init(self, master):
self.master = master
master.title("物料进出库统计")
self.master.state('zoomed') # 窗口最大化
# 创建右侧的工具栏
toolbar_frame = ttk.Frame(master, width=20)
toolbar_frame.pack(side='right', fill='y')
# 创建底部的工具栏
bottom_frame = ttk.Frame(master, height=20)
bottom_frame.pack(side='bottom', fill='x')
# 创建左侧面板
self.container = tk.Frame(master)
self.container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 创建工具栏
toolbar = tk.Frame(master, height=0.2)
self.selected_label = tk.Label(toolbar, text="", fg="red", font=("Arial", 12))
self.selected_label.pack(side=tk.LEFT, padx=0.02, pady=0.02)
# 创建左上方面板
self.container_top = tk.Frame(self.container)
self.container_top.pack(side=tk.TOP, fill=tk.BOTH, expand=True)
# 创建左下方面板
self.container_bottom = tk.Frame(self.container)
self.container_bottom.pack(side=tk.BOTTOM, fill=tk.BOTH, expand=True)
# 创建右侧面板
self.container1 = tk.Frame(master)
self.container1.pack(side=tk.RIGHT, fill=tk.Y, expand=True, anchor='center')
# 打开Excel文件
self.wb = openpyxl.load_workbook(庫存)
self.record_sheet = self.wb["出入庫明細"]
self.data_sheet = self.wb["庫存明細"]
# 获取"數據"工作表的第一列数据
data_col = self.data_sheet['A']
data_list = [cell.value for cell in data_col]
# 在GUI界面中创建标签和下拉输入框
self.label10 = ttk.Label(self.container_top, text="PEGA-料号:")
self.label10.grid(row=0, column=0, padx=5, pady=5)
self.material_name11 = ttk.Combobox(self.container_top, values=data_list)
self.material_name11.grid(row=0, column=1, padx=5, pady=5)
# 设置自动补全功能
if hasattr(self.material_name11, 'set_completion'):
self.material_name11.set_completion(True)
self.label12 = ttk.Label(self.container_top, text="數量:")
self.label12.grid(row=1, column=0, padx=5, pady=5)
self.material_qty12 = ttk.Combobox(self.container_top, values=[])
self.material_qty12.grid(row=1, column=1, padx=5, pady=5)
self.label13 = ttk.Label(self.container_top, text="日期:")
self.label13.grid(row=4, column=0, padx=5, pady=5)
ri = datetime.datetime.now().strftime('%Y/%m/%d')
self.material_qty13 = ttk.Combobox(self.container_top, values=ri)
self.material_qty13.grid(row=4, column=1, padx=5, pady=5)
self.material_qty13.current(0)
# 获取品名列表
self.label14 = ttk.Label(self.container_top, text="時間:")
self.label14.grid(row=5, column=0, padx=5, pady=5)
self.material_qty14 = ttk.Combobox(self.container_top, state='readonly')
self.material_qty14.grid(row=5, column=1, padx=5, pady=5)
self.update_time()
ban = ['D', 'N']
self.label15 = ttk.Label(self.container_top, text="班別:")
self.label15.grid(row=6, column=0, padx=5, pady=5)
self.material_qty15 = ttk.Combobox(self.container_top, values=ban)
self.material_qty15.grid(row=6, column=1, padx=5, pady=5)
self.material_qty15.current(0)
self.label16 = ttk.Label(self.container_top, text="儲位:")
self.label16.grid(row=7, column=0, padx=5, pady=5)
ling2 = ['']
self.material_qty16 = ttk.Combobox(self.container_top, values=ling2)
self.material_qty16.grid(row=7, column=1, padx=5, pady=5)
self.material_qty16.current(0)
self.label17 = ttk.Label(self.container_top, text="登記人:")
self.label17.grid(row=9, column=0, padx=5, pady=5)
ling1 = ['黃娜', '王向松'] # 设置下拉框选项
self.material_qty17 = ttk.Combobox(self.container_top, values=ling1)
self.material_qty17.grid(row=9, column=1, padx=5, pady=5)
self.label18 = ttk.Label(self.container_top, text="入庫單號:")
self.label18.grid(row=10, column=0, padx=5, pady=5)
ling1 = [] # 设置下拉框选项
self.material_qty18 = ttk.Combobox(self.container_top, values=ling1)
self.material_qty18.grid(row=10, column=1, padx=5, pady=5)
# 创建进出库按钮
self.in_button = tk.Button(self.container_top, text="进库", command=self.in_stock)
self.in_button.grid(row=11, column=1, padx=5, pady=5)
# 从工作表中获取数据并写入下拉框中
data_list = []
for row in range(2, self.data_sheet.max_row + 1):
cell_value = self.data_sheet.cell(row=row, column=1).value
if cell_value:
data_list.append(cell_value)
def on_material_name_keyrelease(event):
# 获取用户输入的内容
user_input = self.material_name1.get()
if not user_input:
# 如果用户没有输入任何内容,则展示所有选项
self.material_name1.configure(values=data_list)
else:
# 根据用户输入的内容过滤下拉框的选项
filtered_options = [option for option in data_list if user_input in option]
if filtered_options:
# 如果有符合条件的选项,则更新下拉框的选项并展开下拉框
self.material_name1.configure(values=filtered_options)
self.material_name1.event_generate('<Down>')
else:
# 如果没有符合条件的选项,则关闭下拉框
self.material_name1.event_generate('<Escape>')
# 创建标签
self.label1 = ttk.Label(self.container_bottom, text="PEGA-料号:")
self.label1.grid(row=0, column=0, padx=5, pady=5)
# 添加下拉框控件到界面上
self.material_name1 = ttk.Combobox(self.container_bottom, values=data_list)
self.material_name1.grid(row=0, column=1, padx=5, pady=5)
# 为下拉框控件添加绑定事件
self.material_name1.bind('<KeyRelease>', on_material_name_keyrelease)
self.label2 = ttk.Label(self.container_bottom, text="數量:")
self.label2.grid(row=1, column=0, padx=5, pady=5)
self.material_qty = ttk.Combobox(self.container_bottom, values=[])
self.material_qty.grid(row=1, column=1, padx=5, pady=5)
self.label3 = ttk.Label(self.container_bottom, text="组别:")
self.label3.grid(row=2, column=0, padx=5, pady=5)
sd= ['','生產組', '治具組', '製程組']
self.material_qty3 = ttk.Combobox(self.container_bottom, values=sd)
self.material_qty3.grid(row=2, column=1, padx=5, pady=5)
self.material_qty3.current(0)
sa= ['','PA', 'PB', 'PC', 'PD', 'NF', 'NE', 'ND', 'NC', 'NB', 'NA', 'CSC', 'SC', '治具', '製程'] # 设置下拉框选项
self.label4 = ttk.Label(self.container_bottom, text="线别:")
self.label4.grid(row=3, column=0, padx=5, pady=5)
self.material_qty4 = ttk.Combobox(self.container_bottom, values=sa)
self.material_qty4.grid(row=3, column=1, padx=5, pady=5)
self.material_qty4.current(0)
self.label5 = ttk.Label(self.container_bottom, text="日期:")
self.label5.grid(row=4, column=0, padx=5, pady=5)
ri = datetime.datetime.now().strftime('%Y/%m/%d')
self.material_qty5 = ttk.Combobox(self.container_bottom, values=ri)
self.material_qty5.grid(row=4, column=1, padx=5, pady=5)
self.material_qty5.current(0)
self.label6 = ttk.Label(self.container_bottom, text="時間:")
self.label6.grid(row=5, column=0, padx=5, pady=5)
self.material_qty6 = ttk.Combobox(self.container_bottom)
self.material_qty6.grid(row=5, column=1, padx=5, pady=5)
self.update_time1()
ban= ['D', 'N']
self.label7 = ttk.Label(self.container_bottom, text="班別:")
self.label7.grid(row=6, column=0, padx=5, pady=5)
self.material_qty7 = ttk.Combobox(self.container_bottom, values=ban)
self.material_qty7.grid(row=6, column=1, padx=5, pady=5)
self.material_qty7.current(0)
self.label9 = ttk.Label(self.container_bottom, text="领用类型:")
self.label9.grid(row=8, column=0, padx=5, pady=5)
ling= ['','領用', '更換', '借用'] # 设置下拉框选项
self.material_qty9 = ttk.Combobox(self.container_bottom, values=ling)
self.material_qty9.grid(row=8, column=1, padx=5, pady=5)
self.material_qty9.current(0)
self.label10 = ttk.Label(self.container_bottom, text="登記人:")
self.label10.grid(row=9, column=0, padx=5, pady=5)
ling1 = ['黃娜', '王向松'] # 设置下拉框选项
self.material_qty10 = ttk.Combobox(self.container_bottom, values=ling1)
self.material_qty10.grid(row=9, column=1, padx=5, pady=5)
self.label101 = ttk.Label(self.container_bottom, text="領用人:")
self.label101.grid(row=10, column=0, padx=5, pady=5)
ling1 = ['黃娜', '王向松'] # 设置下拉框选项
self.material_qty101 = ttk.Combobox(self.container_bottom, values=ling1)
self.material_qty101.grid(row=10, column=1, padx=5, pady=5)
# 创建进出库按钮
self.out_button = tk.Button(self.container_bottom, text="出库", command=self.out_stock)
self.out_button.grid(row=11, column=1, padx=5, pady=5)
# 添加显示excel内容的按钮
self.show_button = tk.Button(self.container_bottom, text="显示Excel内容", command=self.show_excel)
self.show_button.grid(row=12, column=0, columnspan=2, padx=5, pady=5)
# 创建标签用于显示工作表名称
self.record_label = tk.Label(self.container1, text="出入庫明細")
self.record_label.grid(row=0, column=3, padx=5, pady=5)
self.data_label = tk.Label(self.container1, text="庫存明細")
self.data_label.grid(row=3, column=3, padx=10, pady=10)
def update_time(self):
# get current time
current_time = datetime.datetime.now().strftime('%H:%M:%S')
# set combobox values
self.material_qty14['values'] = [current_time]
# update combobox
self.material_qty14.current(0)
# schedule next update
self.master.after(1000, self.update_time)
def update_time1(self):
# get current time
current_time = datetime.datetime.now().strftime('%H:%M:%S')
# set combobox values
self.material_qty6['values'] = [current_time]
# update combobox
self.material_qty6.current(0)
# schedule next update
self.master.after(1000, self.update_time1)
def show_excel(self):
style = ttk.Style()
style.configure("MyTreeview1.Treeview", rowheight=25, borderwidth=2, relief="solid", font=('Arial', 10))
style.configure("MyTreeview1.Treeview.Heading", font=('Arial', 10, 'bold'))
style.layout("MyTreeview1.Treeview", [('MyTreeview1.Treeview.treearea', {'sticky': 'nswe'})])
# 创建表格用于显示第一个工作表
columns1 = next(self.record_sheet.iter_rows(min_row=1, max_row=1, values_only=True))
treeview1 = ttk.Treeview(self.container1, columns=columns1, show="headings", style="MyTreeview1.Treeview")
vsb1 = ttk.Scrollbar(self.container1, orient="vertical", command=treeview1.yview)
treeview1.configure(yscrollcommand=vsb1.set)
treeview1.grid(row=1, column=3, rowspan=1, padx=5, pady=5, sticky="nsew")
vsb1.grid(row=1, column=4, rowspan=1, padx=0, pady=5, sticky="ns")
# 设置表格列的标题和宽度
for col in columns1:
treeview1.heading(col, text=col)
treeview1.column(col, width=80, anchor="center")
# 显示第一个工作表的内容
for row in self.record_sheet.iter_rows(min_row=2, values_only=True):
row_values = [str(cell) if cell is not None else "" for cell in row]
if all(not bool(cell) for cell in row_values):
continue
treeview1.insert("", tk.END, values=row_values)
# 创建表格用于显示第二个工作表
columns2 = next(self.data_sheet.iter_rows(min_row=1, max_row=1, values_only=True))
treeview2 = ttk.Treeview(self.container1, columns=columns2, show="headings", style="MyTreeview1.Treeview")
vsb2 = ttk.Scrollbar(self.container1, orient="vertical", command=treeview2.yview)
treeview2.configure(yscrollcommand=vsb2.set)
treeview2.grid(row=5, column=3, rowspan=1, padx=5, pady=5, sticky="nsew")
vsb2.grid(row=5, column=4, rowspan=1, padx=0, pady=5, sticky="ns")
# 设置表格列的标题和宽度
for col in columns2:
treeview2.heading(col, text=col)
treeview2.column(col, width=80, anchor="center")
# 显示第二个工作表的内容
for row in self.data_sheet.iter_rows(min_row=2, values_only=True):
row_values = [str(cell) if cell is not None else "" for cell in row]
if all(not bool(cell) for cell in row_values):
continue
treeview2.insert("", tk.END, values=row_values)
# 创建滚动条
vsb1 = ttk.Scrollbar(self.container1, orient="vertical", command=treeview1.yview)
vsb2 = ttk.Scrollbar(self.container1, orient="vertical", command=treeview2.yview)
hsb1 = ttk.Scrollbar(self.container1, orient="horizontal", command=treeview1.xview)
hsb2 = ttk.Scrollbar(self.container1, orient="horizontal", command=treeview2.xview)
# 将滚动条添加到窗口中
vsb1.grid(row=1, column=4, sticky="ns")
vsb2.grid(row=5, column=4, sticky="ns")
hsb1.grid(row=2, column=3, sticky="ew")
hsb2.grid(row=4, column=3, sticky="ew")
# 将表格的 yscrollcommand 和 xscrollcommand 属性设置为对应的滚动条对象的 set 方法
treeview1.config(yscrollcommand=vsb1.set, xscrollcommand=hsb1.set)
treeview2.config(yscrollcommand=vsb2.set, xscrollcommand=hsb2.set)
for i in range(2):
dyu = self.duibi()
# 创建 Label 和 Entry 控件用于输入查找内容
tk.Label(self.container1, text="查找内容:").grid(row=6, column=3, padx=5, pady=5, sticky="w")
search_entry = tk.Entry(self.container1)
search_entry.grid(row=6, column=3, padx=5, pady=5, sticky="we")
# 创建 Button 控件用于触发查找操作
tk.Button(self.container1, text="查找", command=lambda: search_data(search_entry.get())).grid(row=6, column=2, padx=5,
pady=5, sticky="e")
# 定义回车键事件处理函数
def on_enter(event):
search_data(search_entry.get())
# 绑定回车键事件到search_entry控件
search_entry.bind('<Return>', on_enter)
def search_data(search_text):
# 清空第二个表格中的数据
for child in treeview2.get_children():
treeview2.delete(child)
# 在 Excel 中查找数据,并将符合条件的行添加到第二个表格中
for row in self.data_sheet.iter_rows(min_row=2, values_only=True):
if search_text in str(row[7]):
row_values = [str(cell) if cell is not None else "" for cell in row]
treeview2.insert("", tk.END, values=row_values)
def duibi(self):
self.wb = openpyxl.load_workbook(庫存)
wb2 = openpyxl.load_workbook(比對)
self.record_sheet = self.wb["出入庫明細"]
self.data_sheet = self.wb["庫存明細"]
# 打开工作簿并选择要操作的工作表
data_sheet = self.wb['庫存明細']
record_sheet = self.wb['出入庫明細']
other_sheet = wb2['其他']
# 读取其他信息工作表中的数据,并将其存储到一个字典中
# 将其他信息表转换为pandas的DataFrame对象
other_df = pd.DataFrame(other_sheet.values)
# 设置其他信息表的列名
other_df.columns = ['PEGA-料號', '品名', '中文品名', '單價/RMB', '儲位']
# 将数据表转换为pandas的DataFrame对象
data_df = pd.DataFrame(data_sheet.values)
# 获取数据表的行数和列数
data_rows, data_cols = data_df.shape
# 遍历数据表的每一行
for i in range(2, data_rows + 1):
# 获取数据表中第i行的第1列的值
data_value = data_df.iloc[i - 1, 0]
# 在其他信息表中查找data_value对应的值
match = other_df[other_df['PEGA-料號'] == data_value]['單價/RMB'].values
match1 = other_df[other_df['PEGA-料號'] == data_value]['品名'].values
# 如果找到了匹配的值,则将其写入数据表的第7列
if len(match) > 0:
data_sheet.cell(row=i, column=7).value = match[0]
if len(match1) > 0:
data_sheet.cell(row=i, column=8).value = match1[0]
# 将其他信息表转换为pandas的DataFrame对象
other_df2 = pd.DataFrame(other_sheet.values)
# 设置其他信息表的列名
other_df2.columns = ['PEGA-料號', '品名', '中文品名', '單價/RMB', '儲位']
# 将数据表转换为pandas的DataFrame对象
data_df2 = pd.DataFrame(record_sheet.values)
# 获取数据表的行数和列数
data_rows, data_cols = data_df2.shape
# 遍历数据表的每一行
for i in range(2, data_rows + 1):
# 获取数据表中第i行的第1列的值
data_value = data_df2.iloc[i - 1, 0]
# 在其他信息表中查找data_value对应的值
match = other_df[other_df['PEGA-料號'] == data_value]['單價/RMB'].values
match1 = other_df[other_df['PEGA-料號'] == data_value]['品名'].values
# 如果找到了匹配的值,则将其写入数据表的第7列
if len(match) > 0:
record_sheet.cell(row=i, column=11).value = match[0]
if len(match1) > 0:
record_sheet.cell(row=i, column=12).value = match1[0]
# 将其他信息表转换为pandas的DataFrame对象
other_df = pd.DataFrame(data_sheet.values)
# 设置其他信息表的列名
other_df.columns = ['PEGA-料號', '實際庫存', '日期', '時間', '班別', '登記人', '單價', '品名', '儲位', '入庫單號']
# 将数据表转换为pandas的DataFrame对象
data_df = pd.DataFrame(record_sheet.values)
# 获取数据表的行数和列数
data_rows, data_cols = data_df.shape
# 遍历数据表的每一行
for i in range(2, data_rows + 1):
# 获取数据表中第i行的第1列的值
data_value = data_df.iloc[i - 1, 0]
# 在其他信息表中查找data_value对应的值
match = other_df[other_df['PEGA-料號'] == data_value]['儲位'].values
# 如果找到了匹配的值,则将其写入数据表的第7列
if len(match) > 0:
record_sheet.cell(row=i, column=13).value = match[0]
# 保存工作薄
self.wb.save(庫存)
wb2.close()
def in_stock(self):#進庫函數
# 检查是否有数据
if not self.material_name11.get().strip() or not self.material_qty12.get().strip()or not self.material_qty13.get().strip()or not self.material_qty18.get().strip():
messagebox.showwarning("警告", "未填寫完畢!")
return
# 获取物料名称和数量
material_name = self.material_name11.get()
material_qty = int(self.material_qty12.get())
be="進庫"
material_qty3 = (self.material_qty13.get())
material_qty4 = (self.material_qty14.get())
material_qty5 = (self.material_qty15.get())
material_qty6 = (self.material_qty16.get())
material_qty7 = (self.material_qty17.get())
material_qty8 = (self.material_qty18.get())
if self.data_sheet.cell(row=1, column=1).value is None:
self.data_sheet.cell(row=1, column=1, value="PEGA-料号")
if self.data_sheet.cell(row=1, column=2).value is None:
self.data_sheet.cell(row=1, column=2, value="數量")
if self.data_sheet.cell(row=1, column=3).value is None:
self.data_sheet.cell(row=1, column=3, value="日期")
if self.data_sheet.cell(row=1, column=4).value is None:
self.data_sheet.cell(row=1, column=4, value="時間")
if self.data_sheet.cell(row=1, column=5).value is None:
self.data_sheet.cell(row=1, column=5, value="班別")
if self.data_sheet.cell(row=1, column=6).value is None:
self.data_sheet.cell(row=1, column=6, value="登記人")
if self.data_sheet.cell(row=1, column=7).value is None:
self.data_sheet.cell(row=1, column=7, value="單價")
if self.data_sheet.cell(row=1, column=8).value is None:
self.data_sheet.cell(row=1, column=8, value="品名")
if self.data_sheet.cell(row=1, column=9).value is None:
self.data_sheet.cell(row=1, column=9, value="儲位")
if self.data_sheet.cell(row=1, column=10).value is None:
self.data_sheet.cell(row=1, column=10, value="入庫單號")
if self.record_sheet.cell(row=1, column=1).value is None:
self.record_sheet.cell(row=1, column=1, value="PEGA-料号")
if self.record_sheet.cell(row=1, column=2).value is None:
self.record_sheet.cell(row=1, column=2, value="數量")
if self.record_sheet.cell(row=1, column=3).value is None:
self.record_sheet.cell(row=1, column=3, value="組別")
if self.record_sheet.cell(row=1, column=4).value is None:
self.record_sheet.cell(row=1, column=4, value="綫別")
if self.record_sheet.cell(row=1, column=5).value is None:
self.record_sheet.cell(row=1, column=5, value="日期")
if self.record_sheet.cell(row=1, column=6).value is None:
self.record_sheet.cell(row=1, column=6, value="時間")
if self.record_sheet.cell(row=1, column=7).value is None:
self.record_sheet.cell(row=1, column=7, value="班別")
if self.record_sheet.cell(row=1, column=8).value is None:
self.record_sheet.cell(row=1, column=8, value="類型")
if self.record_sheet.cell(row=1, column=9).value is None:
self.record_sheet.cell(row=1, column=9, value="登記人")
if self.record_sheet.cell(row=1, column=10).value is None:
self.record_sheet.cell(row=1, column=10, value="備注")
if self.record_sheet.cell(row=1, column=11).value is None:
self.record_sheet.cell(row=1, column=11, value="單價")
if self.record_sheet.cell(row=1, column=12).value is None:
self.record_sheet.cell(row=1, column=12, value="品名")
if self.record_sheet.cell(row=1, column=13).value is None:
self.record_sheet.cell(row=1, column=13, value="儲位")
if self.record_sheet.cell(row=1, column=14).value is None:
self.record_sheet.cell(row=1, column=14, value="入庫單號")
if self.record_sheet.cell(row=1, column=15).value is None:
self.record_sheet.cell(row=1, column=15, value="領用人")
# 在数据表中查找物料名称
for row in self.data_sheet.iter_rows(min_row=2):
if row[0].value == material_name:
# 如果找到了,将数量加上去
row[1].value += material_qty
break
else:
# 获取數據表的最后一行空白行
last_row = self.data_sheet.max_row + 1
# 将物料的名称和数量写入到记录表的最后一行空白行
self.data_sheet.cell(row=last_row, column=1, value=material_name)
self.data_sheet.cell(row=last_row, column=2, value=material_qty)
self.data_sheet.cell(row=last_row, column=3, value=material_qty3)
self.data_sheet.cell(row=last_row, column=4, value=material_qty4)
self.data_sheet.cell(row=last_row, column=5, value=material_qty5)
self.data_sheet.cell(row=last_row, column=6, value=material_qty7)
self.data_sheet.cell(row=last_row, column=9, value=material_qty6)
self.data_sheet.cell(row=last_row, column=10, value=material_qty8)
# 在记录表中添加一行
last_row = self.record_sheet.max_row + 1
# 将物料的名称和数量写入到记录表的最后一行空白行
self.record_sheet.cell(row=last_row, column=1, value=material_name)
self.record_sheet.cell(row=last_row, column=2, value=material_qty)
self.record_sheet.cell(row=last_row, column=5, value=material_qty3)
self.record_sheet.cell(row=last_row, column=6, value=material_qty4)
self.record_sheet.cell(row=last_row, column=7, value=material_qty5)
self.record_sheet.cell(row=last_row, column=9, value=material_qty7)
self.record_sheet.cell(row=last_row, column=10, value=be)
self.record_sheet.cell(row=last_row, column=13, value=material_qty6)
self.record_sheet.cell(row=last_row, column=14, value=material_qty8)
# 保存Excel文件
self.wb.save(庫存)
# 清空文本框
self.material_name11.delete(0, tk.END)
self.material_qty13.delete(0, tk.END)
self.material_qty12.delete(0, tk.END)
self.material_qty14.delete(0, tk.END)
self.material_qty15.delete(0, tk.END)
self.material_qty16.delete(0, tk.END)
self.material_qty18.delete(0, tk.END)
self.material_qty17.delete(0, tk.END)
def out_stock(self):#出庫函數
# 检查是否有数据
if not self.material_name1.get().strip() or not self.material_qty.get().strip():
messagebox.showwarning("警告", "请填写物料名称和数量!")
return
# 获取物料名称和数量
material_name = self.material_name1.get()
material_qty = int(self.material_qty.get())
be = "出庫"
material_qty3 = (self.material_qty3.get())
material_qty4 = (self.material_qty4.get())
material_qty5 = (self.material_qty5.get())
material_qty6 = (self.material_qty6.get())
material_qty7 = (self.material_qty7.get())
material_qty9 = (self.material_qty9.get())
material_qty10 = (self.material_qty10.get())
material_qty101 = (self.material_qty101.get())
# 在数据表中查找物料名称
for row in self.data_sheet.iter_rows(min_row=2):
if row[0].value == material_name:
# 获取记录表的最后一行空白行
last_row = self.record_sheet.max_row + 1
# 将物料的名称和数量写入到记录表的最后一行空白行
self.record_sheet.cell(row=last_row, column=1, value=material_name)
self.record_sheet.cell(row=last_row, column=2, value=material_qty)
self.record_sheet.cell(row=last_row, column=3, value=material_qty3)
self.record_sheet.cell(row=last_row, column=4, value=material_qty4)
self.record_sheet.cell(row=last_row, column=5, value=material_qty5)
self.record_sheet.cell(row=last_row, column=6, value=material_qty6)
self.record_sheet.cell(row=last_row, column=7, value=material_qty7)
self.record_sheet.cell(row=last_row, column=8, value=material_qty9)
self.record_sheet.cell(row=last_row, column=9, value=material_qty10)
self.record_sheet.cell(row=last_row, column=10, value=be)
self.record_sheet.cell(row=last_row, column=15, value=material_qty101)
break
# 在数据表中查找物料名称
for row in self.data_sheet.iter_rows(min_row=2):
if row[0].value == material_name:
# 如果找到了,将数量减去
if row[1].value >= material_qty:
row[1].value -= material_qty
# 如果减去后数量为0,删除整行
if row[1].value == 0:
self.data_sheet.delete_rows(row[0].row)
break
else:
tk.messagebox.showerror("错误", "库存不足")
break
else:
# 如果没有找到,就在数据表中添加一行
tk.messagebox.showerror("错误", "無庫存库存")
# 保存Excel文件
self.wb.save(庫存)
# 清空文本框
self.material_name1.delete(0, tk.END)
self.material_qty.delete(0, tk.END)
self.material_qty3.delete(0, tk.END)
self.material_qty4.delete(0, tk.END)
self.material_qty5.delete(0, tk.END)
self.material_qty6.delete(0, tk.END)
self.material_qty7.delete(0, tk.END)
self.material_qty9.delete(0, tk.END)
self.material_qty10.delete(0, tk.END)
self.material_qty101.delete(0, tk.END)
root = tk.Tk()
app = InventoryApp(root)
root.mainloop()
這裏在創建表格時遮擋數據,怎麽解決
r是保持字符串原始值的意思,就是说不对其中的符号进行转义。因为windows下的目录字符串中通常有斜杠"",而斜杠在Python的字符串中有转义的作用。例如:\n表示换行如果路径中有\new就会被转义。加上r就是为了避免这种情况。
根据提供的参考资料,可以使用os库中的path.exists()函数来判断文件路径是否存在,如果存在则可以使用xlrd库中的open_workbook()函数读取文件,否则可以提示路径不存在或者创建空表格。
代码示例:
import os
import xlrd
# 判断文件路径是否存在
path1 = r"r:\物料库存.xlsx"
path2 = r"r:\库存单价\单价表.xlsx"
if not os.path.exists(path1):
print("文件路径1不存在")
if not os.path.exists(path2):
print("文件路径2不存在")
# 读取xlsx文件
if os.path.exists(path1):
data = xlrd.open_workbook(path1)
table = data.sheet_by_index(0)
nrows = table.nrows
ncols = table.ncols
print(nrows, ncols)
# 创建空表格
if not os.path.exists(path2):
from openpyxl import Workbook
wb = Workbook()
ws = wb.create_sheet("Sheet1", 0)
ws.title = "empty_sheet"
wb.save(path2)
如果数据可能被遮挡,可以使用openpyxl库中的workbook对象的freeze_panes属性来设置表格窗格的位置,使得数据表格固定在屏幕最上方,不会被其它行或列遮挡。代码示例:
from openpyxl import Workbook
wb = Workbook()
ws = wb.active
# 冻结表头
ws.freeze_panes = 'A2'
# 设置表头数据
headers = ["姓名", "年龄", "性别"]
for index, header in enumerate(headers):
ws.cell(row=1, column=index+1, value=header)
# 设置数据行
data = [["张三", 20, "男"],
["李四", 22, "女"],
["王五", 25, "男"]]
for row, line in enumerate(data):
for col, value in enumerate(line):
ws.cell(row=row+2, column=col+1, value=value)
wb.save("test.xlsx")