def load_excel(self, filename, menu_label, selected_label_text): self.la = menu_label self.workbook = xl.load_workbook(filename) self.sheet_names = sorted(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工作表名生成的按鈕的地方添加一個垂直滾動條用來顯示按鈕,請給出修改後的代碼
时间: 2024-02-12 19:03:30 浏览: 20
好的,您可以将panel_left面板的布局改为使用tkinter的Scrollbar控件,代码如下:
```
def load_excel(self, filename, menu_label, selected_label_text):
self.la = menu_label
self.workbook = xl.load_workbook(filename)
self.sheet_names = sorted(self.workbook.sheetnames) # 按工作表名称从小到大排序
self.selected_label.config(text=selected_label_text) # 更新选中标签文本
# 清空左侧面板
for widget in self.panel_left.winfo_children():
widget.destroy()
# 添加工作表按钮
self.button_frame = tk.Frame(self.panel_left)
self.button_frame.grid(row=0, column=0, sticky="nsew")
# 添加一个标记,表示该按钮未被使用
self.button_used = [False] * len(self.sheet_names)
# 绑定鼠标进入和离开事件
def on_enter_button(button):
if not self.button_used[button.index]:
button.configure(bg="lightgray")
def on_leave_button(button):
if not self.button_used[button.index]:
button.configure(bg="SystemButtonFace")
# 绑定按钮的点击事件
def on_click_button(button):
if not self.button_used[button.index]:
self.button_used[button.index] = True
button.configure(bg="green")
button.unbind("<Button-1>")
button.unbind("<Enter>")
button.unbind("<Leave>")
for child in self.button_frame.winfo_children():
if child != button:
child.unbind("<Button-1>")
child.configure(bg="SystemButtonFace")
# 添加工作表按钮和滚动条
self.canvas = tk.Canvas(self.button_frame)
self.scrollbar = tk.Scrollbar(self.button_frame, orient="vertical", command=self.canvas.yview)
self.scrollable_frame = tk.Frame(self.canvas)
self.scrollable_frame.bind(
"<Configure>",
lambda e: self.canvas.configure(
scrollregion=self.canvas.bbox("all")
)
)
self.canvas.create_window((0, 0), window=self.scrollable_frame, anchor="nw")
self.canvas.configure(yscrollcommand=self.scrollbar.set)
for i, sheet_name in enumerate(self.sheet_names):
button = tk.Button(self.scrollable_frame, text=sheet_name)
button.index = i
button.grid(row=i, column=0, sticky="ew", padx=1, pady=1)
button.bind("<Enter>", lambda e, button=button: on_enter_button(button))
button.bind("<Leave>", lambda e, button=button: on_leave_button(button))
button.bind("<Button-1>", lambda e, button=button: on_click_button(button))
self.canvas.grid(row=0, column=0, sticky="nsew")
self.scrollbar.grid(row=0, column=1, sticky="ns")
self.button_frame.grid_rowconfigure(0, weight=1)
self.button_frame.grid_columnconfigure(0, weight=1)
```
这里我们使用了Canvas控件作为容器,然后将滚动条控件与Canvas控件绑定,实现按需滚动。同时,我们也修改了按钮的绑定事件,使得在按钮被点击后,其他按钮的点击事件都会被取消绑定,同时被点击的按钮的背景色变为绿色。