def load_excel(self, filename, menu_label,selected_label_text): self.la = menu_label self.workbook = xl.load_workbook(filename) self.sheet_names = self.workbook.sheetnames self.selected_label.config(text=selected_label_text) # 更新选中标签文本 # 清空左侧面板 for widget in self.panel_left.winfo_children(): widget.destroy() # 添加工作表按钮 for i, sheet_name in enumerate(self.sheet_names): button = tk.Button(self.panel_left, text=sheet_name, command=lambda name=sheet_name: self.show_sheet(name)) button.grid(row=i, column=0, sticky="ew", padx=1, pady=1) # 添加一个标记,表示该按钮未被使用 button.used = False # 绑定鼠标进入事件 button.bind("<Enter>", lambda event, button=button: button.configure(bg="lightgray")) # 绑定鼠标离开事件 button.bind("<Leave>", lambda event, button=button: button.configure(bg="SystemButtonFace")) # 绑定按钮的点击事件 button.bind("<Button-1>", lambda event, button=button: mark_used(button)) def mark_used(button): if not button.used: # 将按钮的标记设置为“已使用” button.used = True # 更改按钮的背景颜色 button.configure(bg="green") # 取消按钮的绑定事件 button.unbind("<Button-1>") # 绑定鼠标离开事件,使按钮的背景颜色保持不变 button.bind("<Leave>", lambda event, button=button: button.configure(bg="green")) for child in button.master.winfo_children(): # 绑定按钮的点击事件 child.bind("<Button-1>", lambda event, button=child: mark_used(button))修改這段代碼,如果讀取的excel的工作表有很多,在這個左側面板沒有完全顯示,而且還很密集,該怎麽解決
时间: 2023-12-23 13:03:17 浏览: 32
可以将工作表按钮放在一个滚动面板中,这样可以让左侧面板不会因为工作表太多而过于密集。具体实现步骤如下:
1. 在左侧面板中添加一个滚动面板,用来容纳工作表按钮;
2. 将工作表按钮放在滚动面板中;
3. 设置滚动面板的滚动条,以便用户可以滚动查看所有工作表按钮;
4. 当用户点击工作表按钮时,根据按钮的位置和滚动条的位置,计算出工作表在excel文件中的位置,并显示在右侧面板中。
下面是修改后的代码:
```
def load_excel(self, filename, menu_label, selected_label_text):
self.la = menu_label
self.workbook = xl.load_workbook(filename)
self.sheet_names = self.workbook.sheetnames
self.selected_label.config(text=selected_label_text) # 更新选中标签文本
# 清空左侧面板
for widget in self.panel_left.winfo_children():
widget.destroy()
# 添加一个滚动面板
scroll_panel = tk.Frame(self.panel_left)
scroll_panel.grid(row=0, column=0, sticky="nsew")
# 添加工作表按钮
for i, sheet_name in enumerate(self.sheet_names):
button = tk.Button(scroll_panel, text=sheet_name, command=lambda name=sheet_name: self.show_sheet(name))
button.grid(row=i, column=0, sticky="ew", padx=1, pady=1)
# 添加一个标记,表示该按钮未被使用
button.used = False
# 绑定鼠标进入事件
button.bind("<Enter>", lambda event, button=button: button.configure(bg="lightgray"))
# 绑定鼠标离开事件
button.bind("<Leave>", lambda event, button=button: button.configure(bg="SystemButtonFace"))
# 绑定按钮的点击事件
button.bind("<Button-1>", lambda event, button=button: mark_used(button))
# 设置滚动条
scrollbar = tk.Scrollbar(scroll_panel, orient="vertical")
scrollbar.grid(row=0, column=1, sticky="ns")
scrollbar.config(command=scroll_panel.yview)
scroll_panel.config(yscrollcommand=scrollbar.set)
def mark_used(button):
if not button.used:
# 将按钮的标记设置为“已使用”
button.used = True
# 更改按钮的背景颜色
button.configure(bg="green")
# 取消按钮的绑定事件
button.unbind("<Button-1>")
# 绑定鼠标离开事件,使按钮的背景颜色保持不变
button.bind("<Leave>", lambda event, button=button: button.configure(bg="green"))
for child in button.master.winfo_children():
# 绑定按钮的点击事件
child.bind("<Button-1>", lambda event, button=child: mark_used(button))
# 根据按钮的位置和滚动条的位置,计算出工作表在excel文件中的位置,并显示在右侧面板中
index = scroll_panel.grid_slaves().index(button)
row = index // 2
col = index % 2
self.show_sheet(self.sheet_names[row], col)
```