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 = tk.Frame(master, width=150, bg='lightcyan') self.panel_left.pack(side=tk.LEFT, fill=tk.Y) # 添加滚动条以滚动日志框中的内容 scroll = tk.Scrollbar(self.panel_left, command=self.panel_left.yview) scroll.pack(side=tk.LEFT, fill=tk.Y) self.panel_left.config(yscrollcommand=scroll.set) # 设置滚动条长度 def scroll_update(*args): scroll.place( relheight=1.0, height=-30, width=14, x=self.panel_left.winfo_width() - 12, y=0 ) self.panel_left.bind("<Configure>", scroll_update) scroll_update() 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))報這個AttributeError: 'Frame' object has no attribute 'yview'怎麽修改
时间: 2024-02-12 09:04:13 浏览: 78
DotNet导出Excel的示例
这个错误可能是因为你的 self.panel_left 不是一个可滚动的 widget,因此没有 yview 属性。你可以尝试将 self.panel_left 改成一个可滚动的 widget,比如将它改成 tk.Canvas(),然后再添加一个 tk.Frame() 作为它的子 widget,就可以让它具有滚动条了。例如:
```
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')
# 创建左侧面板,使用 Canvas 和 Frame 实现滚动条
self.panel_left = tk.Canvas(master, width=150, bg='lightcyan')
self.panel_left.pack(side=tk.LEFT, fill=tk.Y)
scroll = tk.Scrollbar(master, command=self.panel_left.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
self.panel_left.config(yscrollcommand=scroll.set)
self.panel_left_frame = tk.Frame(self.panel_left)
self.panel_left.create_window((0, 0), window=self.panel_left_frame, anchor='nw')
# 设置滚动条长度
def scroll_update(*args):
self.panel_left.configure(scrollregion=self.panel_left.bbox("all"))
self.panel_left_frame.bind("<Configure>", scroll_update)
scroll_update()
# 其他代码不变
```
这里我们使用了 tk.Canvas() 来创建一个可滚动的 widget,并使用 tk.Frame() 作为它的子 widget,来放置工作表按钮。同时,我们在 self.panel_left_frame 上绑定了一个 "<Configure>" 事件,以便在子 widget 大小发生变化时更新滚动条长度。
阅读全文