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')#窗口最大化 # 创建菜单栏# 创建菜单栏 menubar = tk.Menu(master) master.config(menu=menubar) # 创建文件菜单及其子菜单 filemenu = tk.Menu(menubar, tearoff=0) filemenu.add_command(label="PA綫", command=lambda: self.load_excel(r'D:\拆分后的工作簿\新增資料夾\PA點檢.xlsx', "PA綫", "PA綫"), compound='left', image='', foreground='black', font=('Microsoft JhengHei', 12)) menubar = tk.Menu(master) master.config(menu=menubar)# 创建左侧面板 self.panel_left = tk.Frame(master, width=150, bg='lightcyan') self.panel_left.pack(side=tk.LEFT, fill=tk.Y) 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 15:05:53 浏览: 138
DotNet导出Excel的示例
可以使用`tk.Scrollbar`和`tk.Canvas`来实现左侧面板的垂直滚动。首先,在创建左侧面板时,需要将其放在一个`tk.Frame`中,并在该`Frame`上添加一个`tk.Canvas`和一个`tk.Scrollbar`,然后将需要滚动的按钮放在`Canvas`中。接下来,需要绑定`Scrollbar`的滚动事件和`Canvas`的滚动事件,以便在滚动`Scrollbar`时,`Canvas`中的按钮能够随之滚动。下面是修改后的代码片段:
```
# 创建左侧面板
self.panel_left = tk.Frame(master, width=150, bg='lightcyan')
self.panel_left.pack(side=tk.LEFT, fill=tk.Y)
# 在左侧面板上添加Canvas和Scrollbar
self.canvas = tk.Canvas(self.panel_left, bg='lightcyan')
self.scrollbar = tk.Scrollbar(self.panel_left, orient=tk.VERTICAL, command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.scrollbar.set)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
# 在Canvas中添加工作表按钮
self.inner_frame = tk.Frame(self.canvas, bg='lightcyan')
self.inner_frame.bind("<Configure>", lambda e: self.canvas.configure(scrollregion=self.canvas.bbox("all")))
self.canvas.create_window((0, 0), window=self.inner_frame, anchor="nw")
for i, sheet_name in enumerate(self.sheet_names):
button = tk.Button(self.inner_frame, text=sheet_name, command=lambda name=sheet_name: self.show_sheet(name))
button.grid(row=i, column=0, sticky="ew", padx=1, pady=1)
# ...
# 绑定Canvas和Scrollbar的滚动事件
self.canvas.bind('<Configure>', lambda e: self.canvas.itemconfig(self.inner_frame_id, width=e.width))
self.inner_frame_id = self.canvas.create_window((0, 0), window=self.inner_frame, anchor="nw")
self.canvas.bind('<MouseWheel>', lambda e: self.canvas.yview_scroll(int(-1*(e.delta/120)), 'units'))
```
在上面的代码中,我们创建了一个内部的`Frame`,并将其添加到`Canvas`中。然后,在内部`Frame`上添加工作表按钮。接下来,我们绑定了`inner_frame`的`<Configure>`事件,以便在`Canvas`的大小改变时更新`scrollregion`。我们还绑定了`Canvas`的`<Configure>`事件,以便在`Canvas`的大小改变时更新`inner_frame`的宽度。最后,我们绑定了`Canvas`的`<MouseWheel>`事件,以便在滚动鼠标滚轮时滚动`Canvas`。
阅读全文