請根据如上兩段代碼在左側面板中根據讀取的excel表名生成的按鈕按名字相近排列並添加滾動條來防止excel工作表過多導致顯示不全,給出修改後的完整代碼
时间: 2024-02-11 08:08:58 浏览: 90
表格加滚动条
可以使用 tkinter 中的 ScrolledFrame 来实现左侧面板的滚动条功能,同时可以使用 Python 中的 difflib 库来对 Excel 工作表名称进行相似度匹配,从而实现按名称相似排列的功能。以下是修改后的完整代码:
```
import tkinter as tk
from tkinter import ttk
from openpyxl import load_workbook
import difflib
class ExcelViewer:
def __init__(self, master):
self.master = master
self.master.title("Excel Viewer")
# 创建左侧面板及滚动条
self.scrollframe = ScrolledFrame(self.master)
self.scrollframe.pack(side="left", fill="both", expand=True)
# 创建右侧面板
self.panel_right = tk.Frame(self.master)
self.panel_right.pack(side="right", fill="both", expand=True)
# 创建菜单栏
self.menu = tk.Menu(self.master)
self.master.config(menu=self.menu)
# 添加“文件”菜单
file_menu = tk.Menu(self.menu)
self.menu.add_cascade(label="文件", menu=file_menu)
file_menu.add_command(label="打开", command=self.open_file)
file_menu.add_command(label="退出", command=self.master.quit)
# 添加“帮助”菜单
help_menu = tk.Menu(self.menu)
self.menu.add_cascade(label="帮助", menu=help_menu)
help_menu.add_command(label="关于", command=self.show_about)
def open_file(self):
self.filename = tk.filedialog.askopenfilename(title="选择文件", filetypes=[("Excel 文件", "*.xlsx;*.xls")])
if self.filename:
self.load_excel(self.filename)
def load_excel(self, filename):
self.workbook = load_workbook(filename)
self.sheet_names = self.workbook.sheetnames
# 使用 difflib 库对工作表名称进行相似度匹配,并按名称相似排列
self.sheet_names = sorted(self.sheet_names, key=lambda x: difflib.SequenceMatcher(None, x, self.la.get()).ratio(), reverse=True)
# 清空左侧面板
for widget in self.scrollframe.interior.winfo_children():
widget.destroy()
# 添加工作表按钮
for i, sheet_name in enumerate(self.sheet_names):
button = tk.Button(self.scrollframe.interior, 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: self.mark_used(button))
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 self.scrollframe.interior.winfo_children():
child.bind("<Button-1>", lambda event, button=child: self.mark_used(button))
def show_sheet(self, sheet_name):
# 清空右侧面板
for widget in self.panel_right.winfo_children():
widget.destroy()
# 添加工作表名称标签
label = tk.Label(self.panel_right, text=sheet_name)
label.pack()
# 添加工作表内容表格
table = ttk.Treeview(self.panel_right, columns=list(range(1, 100)))
table.pack(side="left", fill="both", expand=True)
# 添加表头
for i in range(1, 100):
table.heading(i, text=i)
# 添加表格内容
sheet = self.workbook[sheet_name]
for row in sheet.iter_rows():
values = [cell.value for cell in row]
table.insert("", "end", values=values)
def show_about(self):
tk.messagebox.showinfo("关于", "Excel Viewer v1.0")
class ScrolledFrame(tk.Frame):
def __init__(self, parent, **kwargs):
tk.Frame.__init__(self, parent, **kwargs)
# 创建 Canvas 和 Scrollbar
self.vscrollbar = tk.Scrollbar(self, orient="vertical")
self.vscrollbar.pack(side="right", fill="y", expand=False)
self.canvas = tk.Canvas(self, bd=0, highlightthickness=0, yscrollcommand=self.vscrollbar.set)
self.canvas.pack(side="left", fill="both", expand=True)
self.vscrollbar.config(command=self.canvas.yview)
# 创建一个内部框架以容纳窗口部件
self.interior = tk.Frame(self.canvas)
self.interior_id = self.canvas.create_window(0, 0, window=self.interior, anchor="nw")
# 绑定事件
self.bind("<Configure>", self.set_scrollregion)
self.interior.bind("<Configure>", self.set_scrollregion)
self.canvas.bind("<Configure>", self.set_scrollregion)
self.canvas.bind_all("<MouseWheel>", self._on_mousewheel)
def set_scrollregion(self, event=None):
# 计算 Canvas 的滚动范围
self.canvas.configure(scrollregion=self.canvas.bbox("all"))
def _on_mousewheel(self, event):
# 滚动鼠标滚轮时,滚动条也跟随滚动
self.canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")
if __name__ == "__main__":
root = tk.Tk()
app = ExcelViewer(root)
root.mainloop()
```
在修改后的代码中,我们创建了一个 ScrolledFrame 类来实现左侧面板的滚动条功能。在 load_excel 函数中,使用 difflib 库对 Excel 工作表名称进行相似度匹配,并按名称相似排列,然后添加工作表按钮到 ScrolledFrame 中。最后,为了实现滚动条功能,我们在 ScrolledFrame 类中添加了一个 Canvas 和 Scrollbar,并通过绑定事件来实现滚动条的跟随滚动。
阅读全文