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))在這段代碼中如果讀取到工作表名太多生成按鈕太密集該怎麽修改
时间: 2023-12-23 20:03:17 浏览: 28
如果读取到的工作表名太多,可能会导致按钮太密集,可以考虑通过添加滚动条来解决这个问题。具体来说,可以将左侧面板设置为一个带有垂直滚动条的容器,然后将按钮添加到该容器中,并按需滚动容器以查看所有按钮。
以下是修改后的代码示例:
```
class ExcelApp:
def __init__(self, master):
self.master = master
master.title("Excel App")
# 获取屏幕的宽度和高度
screen_width = master.winfo_screenwidth()
screen_height = master.winfo_screenheight()
# 将窗口的大小设置为屏幕的大小
master.geometry("%dx%d" % (screen_width, screen_height))
master.state('zoomed') # 窗口最大化
# 创建左侧面板容器及垂直滚动条
self.panel_left_frame = tk.Frame(master)
self.panel_left_frame.pack(side=tk.LEFT, fill=tk.Y)
self.panel_left_scrollbar = tk.Scrollbar(self.panel_left_frame, orient=tk.VERTICAL)
self.panel_left_scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 创建左侧面板并将其放置到滚动容器中
self.panel_left = tk.Frame(self.panel_left_frame, width=150, bg='lightcyan')
self.panel_left.pack(side=tk.LEFT, fill=tk.Y)
self.panel_left_scrollbar.config(command=self.panel_left.yview)
self.panel_left.config(yscrollcommand=self.panel_left_scrollbar.set)
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))
# 更新左侧面板的大小以适应按钮数量
self.panel_left.update_idletasks()
self.panel_left.config(height=self.panel_left.winfo_reqheight())
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))
```
在以上代码中,我添加了一个名为 `panel_left_frame` 的新容器,并将其放置在 `panel_left` 的左侧。然后,我在 `panel_left_frame` 中添加了一个名为 `panel_left_scrollbar` 的新滚动条,并将其设置为垂直方向。接下来,我将 `panel_left` 放置在 `panel_left_frame` 中,并将其设置为滚动容器,以便在需要时可以滚动。
在 `load_excel` 函数中,我添加了一些代码以更新左侧面板的大小,以适应按钮的数量。具体来说,我使用 `update_idletasks` 函数强制更新 `panel_left` 的大小,然后使用 `winfo_reqheight` 函数获取其请求的高度,并将其设置为 `panel_left` 的实际高度。
这些修改可以帮助您在添加大量工作表按钮时更好地管理它们,并确保它们不会太密集,也不会超出界面范围。