python檢查一下是否存在問題

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()
這裏在創建表格時遮擋數據,怎麽解決

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这篇博客: Python-批处理.xlsx文件与.xls文件相互转换中的 在目录前加一个r的原因: 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    r是保持字符串原始值的意思,就是说不对其中的符号进行转义。因为windows下的目录字符串中通常有斜杠"",而斜杠在Python的字符串中有转义的作用。例如:\n表示换行如果路径中有\new就会被转义。加上r就是为了避免这种情况。

  • 以下回答来自chatgpt:

    根据提供的参考资料,可以使用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")
    

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^