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后生成的excel工作表按鈕如果工作表有很多會導致按鈕沒有顯示完全并且很密集該怎麽解決,給出完整代碼
时间: 2023-12-23 07:03:17 浏览: 83
可以使用tkinter的Scrollbar控件来解决这个问题,代码如下:
```
import tkinter as tk
import openpyxl as xl
class ExcelViewer(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master = master
self.master.title("Excel Viewer")
self.master.geometry("800x600")
self.panel_left = tk.Frame(self.master)
self.panel_left.pack(side="left", fill="y")
self.panel_right = tk.Frame(self.master)
self.panel_right.pack(side="right", fill="both", expand=True)
self.scrollbar = tk.Scrollbar(self.panel_left)
self.scrollbar.pack(side="right", fill="y")
self.selected_label = tk.Label(self.panel_right, text="Selected Sheet")
self.selected_label.pack(side="top", pady=10)
self.load_excel("example.xlsx", tk.Label(self.panel_right, text="Sheet List"))
def load_excel(self, filename, menu_label):
self.la = menu_label
self.workbook = xl.load_workbook(filename)
self.sheet_names = self.workbook.sheetnames
self.selected_label.config(text="Selected Sheet: None") # 更新选中标签文本
self.sheet_buttons = []
# 清空左侧面板
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.pack(side="top", fill="x", padx=1, pady=1)
self.sheet_buttons.append(button)
# 添加一个标记,表示该按钮未被使用
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: self.mark_used(button))
# 绑定滚动条和按钮列表
self.scrollbar.config(command=self.panel_left.yview)
self.panel_left.config(yscrollcommand=self.scrollbar.set)
def show_sheet(self, sheet_name):
self.selected_label.config(text="Selected Sheet: {}".format(sheet_name))
sheet = self.workbook[sheet_name]
# 清空右侧面板
for widget in self.panel_right.winfo_children()[1:]:
widget.destroy()
# 添加表格
for row in sheet.iter_rows():
row_widgets = []
for cell in row:
label = tk.Label(self.panel_right, text=str(cell.value))
label.pack(side="left", padx=5, pady=5)
row_widgets.append(label)
self.panel_right.pack(side="top", fill="x", padx=10, pady=5)
def mark_used(self, 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: self.mark_used(button))
if __name__ == "__main__":
root = tk.Tk()
app = ExcelViewer(root)
app.mainloop()
```
这个版本的代码会在左侧面板上添加一个Scrollbar控件,当工作表按钮数量过多时,可以通过滚动条来查看所有的按钮。在load_excel方法中,我们先创建了一个Scrollbar控件,并设置其在左侧面板的右侧,并填充整个面板。然后再将左侧面板上的所有按钮绑定到Scrollbar上。在按钮的创建过程中,我们使用了pack布局,使所有按钮在垂直方向上排列,当按钮数量过多时,会自动出现滚动条,以便查看所有按钮。
阅读全文