class InventoryApp: def init(self, master): # 窗口初始化和界面布局 ... # 打开Excel文件 self.wb = openpyxl.load_workbook(r"C:\Users\bing3_chen\Desktop\1.xlsx") self.record_sheet = self.wb["記錄"] self.data_sheet = self.wb["數據"] # 品名输入框和单价输入框 self.material_qty6 = ttk.Combobox(self.container_bottom, values=[]) self.material_qty6.grid(row=5, column=1, padx=5, pady=5) self.material_qty6.bind("<<ComboboxSelected>>", self.get_price) self.material_qty8 = ttk.Combobox(self.container_bottom, values=['']) self.material_qty8.grid(row=7, column=1, padx=5, pady=5) self.material_qty8.current(0) def get_price(self, event): # 获取品名输入框中的值 material_name = self.material_qty6.get() # 在“数据”表中查找品名对应的行 for row in self.data_sheet.iter_rows(min_row=2, max_col=6, values_only=True): if row[3] == material_name: # 将单价写入单价输入框 self.material_qty8.set(row[5]) break爲什麽沒有寫入
时间: 2024-03-12 12:46:33 浏览: 113
根据代码,可能是因为 `self.material_qty8` 的 `values` 属性为 `['']`,导致无法正确设置其值。建议将 `self.material_qty8` 的 `values` 属性设置为包含单价的列表,如下所示:
```python
# 在“数据”表中查找品名对应的行
for row in self.data_sheet.iter_rows(min_row=2, max_col=6, values_only=True):
if row[3] == material_name:
# 将单价写入单价输入框
self.material_qty8['values'] = [row[5]]
self.material_qty8.current(0)
break
```
这样就可以将单价正确地写入单价输入框 `self.material_qty8` 中。
相关问题
class InventoryApp: def init(self, master): self.master = master master.title("物料进出库统计") self.master.state('zoomed') # 窗口最大化 # 创建左侧面板 self.container = tk.Frame(master) self.container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 创建左上方面板 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)# 打开Excel文件 self.wb = openpyxl.load_workbook(r"C:\Users\bing3_chen\Desktop\1.xlsx") self.record_sheet = self.wb["記錄"] self.data_sheet = self.wb["數據"]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, values=[]) self.material_qty6.grid(row=5, column=1, padx=5, pady=5)self.label8 = ttk.Label(self.container_bottom, text="单价:") self.label8.grid(row=7, column=0, padx=5, pady=5) ling2= [''] self.material_qty8 = ttk.Combobox(self.container_bottom, values=ling2) self.material_qty8.grid(row=7, column=1, padx=5, pady=5) self.material_qty8.current(0)根據品名輸入框中的内容去獲取excel表名為數據的第4列相同内容的第6列對應的内容自動寫入單價輸入框中
您需要在品名输入框中绑定一个事件,当输入框中的内容发生变化时,触发事件。事件处理函数中,您可以使用openpyxl库读取Excel文件,找到表名为“数据”的第四列与品名输入框中的值相同的行,然后获取该行第六列的值,自动填入单价输入框中。以下是一个示例代码:
```
import openpyxl
class InventoryApp:
def __init__(self, master):
# 窗口初始化和界面布局
...
# 打开Excel文件
self.wb = openpyxl.load_workbook(r"C:\Users\bing3_chen\Desktop\1.xlsx")
self.record_sheet = self.wb["記錄"]
self.data_sheet = self.wb["數據"]
# 品名输入框和单价输入框
self.material_qty6 = ttk.Combobox(self.container_bottom, values=[])
self.material_qty6.grid(row=5, column=1, padx=5, pady=5)
self.material_qty6.bind("<<ComboboxSelected>>", self.get_price)
self.material_qty8 = ttk.Combobox(self.container_bottom, values=[''])
self.material_qty8.grid(row=7, column=1, padx=5, pady=5)
self.material_qty8.current(0)
def get_price(self, event):
# 获取品名输入框中的值
material_name = self.material_qty6.get()
# 在“数据”表中查找品名对应的行
for row in self.data_sheet.iter_rows(min_row=2, max_col=6, values_only=True):
if row[3] == material_name:
# 将单价写入单价输入框
self.material_qty8.set(row[5])
break
```
class InventoryApp: def init(self, master): self.master = master master.title("物料进出库统计") master.state('zoomed') # 窗口最大化 # 创建左侧面板 self.container = tk.Frame(master) self.container.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) # 创建左上方面板 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) # 打开Excel文件 self.wb = openpyxl.load_workbook(r"C:\Users\bing3_chen\Desktop\1.xlsx") self.record_sheet = self.wb["記錄"] self.data_sheet = self.wb["數據"] # 从工作表中获取数据并写入下拉框中 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_name11.get() if not user_input: # 如果用户没有输入任何内容,则展示所有选项 self.material_name11.configure(values=data_list) else: # 根据用户输入的内容过滤下拉框的选项 filtered_options = [option for option in data_list if user_input in option] if filtered_options: # 如果有符合条件的选项,则更新下拉框的选项并展开下拉框 self.material_name11.configure(values=filtered_options) self.material_name11.event_generate('<Down>') # 根据用户输入的内容在数据表中筛选出对应的行 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 == user_input: # 找到对应的行后,将第4列的值填入material_qty14中 self.material_qty14.set(self.data_sheet.cell(row=row, column=4).value) break else: # 如果没有符合条件的选项,则关闭下拉框 self.material_name11.event_generate('<Escape>') # 创建标签 self.label10 = ttk.Label(self.container_top, text="PEGA-料号:") self.label10.grid(row=0, column=0, padx=5, pady=5) # 获取品名列表 self.label14 = ttk.Label(self.container_bottom, text="品名:") self.label14.grid(row=5, column=0, padx=5, pady=5) self.material_qty14 = ttk.Combobox(self.container_bottom, values=[]) self.material_qty14.grid(row=5, column=1, 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) self.material_name11.bind('<KeyRelease>', on_material_name_keyrelease)material_qty14 沒有獲取到相應的數據
从您提供的代码来看,当用户在下拉框中选择一个物料名称时,会触发 `on_material_name_keyrelease` 函数,然后根据用户输入的物料名称,在数据表中筛选出对应的行,并将该行的第四列数据填充到 `material_qty14` 中。但是,我没有看到在哪里给 `material_qty14` 设置了初始值。
如果 `material_qty14` 没有獲取到相應的數據,可能是因为没有匹配到用户输入的物料名称,或者是没有在数据表中找到与用户输入的物料名称对应的行。您可以在 `on_material_name_keyrelease` 函数中加入一些调试信息,以便更好地定位问题。例如,在没有找到匹配的行时,可以在控制台输出一些消息,查看程序运行时的问题所在。
另外,您可以检查一下数据表中的数据是否正确,并确认您输入的物料名称在数据表中是否存在。
阅读全文