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_frame.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()報AttributeError: 'ExcelApp' object has no attribute 'panel_left_frame'
时间: 2024-02-04 19:04:08 浏览: 153
这个错误提示是因为在创建左侧面板时,`self.panel_left_frame` 没有被正确地创建。可能是因为在创建 `scroll` 滚动条时,应该使用 `self.panel_left_frame` 而不是 `self.panel_left`。可以尝试将以下代码:
```
scroll = tk.Scrollbar(master, command=self.panel_left_frame.yview)
scroll.pack(side=tk.LEFT, fill=tk.Y)
```
修改为:
```
scroll = tk.Scrollbar(self.panel_left, command=self.panel_left_frame.yview)
scroll.pack(side=tk.RIGHT, fill=tk.Y)
```
这样应该就可以正确创建 `self.panel_left_frame` 了,解决这个错误。
相关问题
class LoginWindow: def __init__(self, master): self.master = master self.master.title("Login Window") self.master.geometry("300x250") self.master.resizable(0, 0) self.username = tk.StringVar() self.password = tk.StringVar()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')#窗口最大化# 查询窗口 class QueryWindow: def __init__(self, master): self.master = master master.title("查詢窗口") # 获取屏幕的宽度和高度 screen_width = root.winfo_screenwidth() screen_height = root.winfo_screenheight() # 将窗口的大小设置为屏幕的大小 master.geometry("%dx%d" % (screen_width, screen_height)) master.state('zoomed')#窗口最大化if __name__ == '__main__': root = tk.Tk() app = LoginWindow(root) root.mainloop()這個代碼中我有三個窗口,第一個銷毀后第三個就報self.tk.call( _tkinter.TclError: can't invoke "toplevel" command: application has been destroyed怎麽解決
你的问题可能是因为你在第三个窗口中使用了 `root`,而 `root` 在第一个窗口销毁后已经被销毁了。你可以在第三个窗口中使用 `master`,即 `QueryWindow` 类的 `__init__` 方法中的 `master`,这个变量是当前窗口的主 `Tk()` 对象。修改后的代码如下:
```
class LoginWindow:
def __init__(self, master):
self.master = master
self.master.title("Login Window")
self.master.geometry("300x250")
self.master.resizable(0, 0)
self.username = tk.StringVar()
self.password = tk.StringVar()
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') # 窗口最大化
# 查询窗口
class QueryWindow:
def __init__(self, master):
self.master = master
self.master.title("查詢窗口")
# 获取屏幕的宽度和高度
screen_width = self.master.winfo_screenwidth()
screen_height = self.master.winfo_screenheight()
# 将窗口的大小设置为屏幕的大小
self.master.geometry("%dx%d" % (screen_width, screen_height))
self.master.state('zoomed') # 窗口最大化
if __name__ == '__main__':
root = tk.Tk()
app = LoginWindow(root)
root.mainloop()
```
这样,你就可以在第三个窗口中使用 `self.master`(也可以用 `master`)代替 `root`,避免了 `root` 被销毁后出现的问题。
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)# 创建左侧面板 self.panel_left = tk.Frame(master, width=150, bg='lightcyan') self.panel_left.pack(side=tk.LEFT, fill=tk.Y)怎麽在這個代碼中的左側面板添加垂直滾動條,來滾動生成的數據
您可以使用 `tk.Scrollbar` 和 `tk.Canvas` 来实现这个功能。首先,您需要在左侧面板中添加一个 `tk.Canvas` 组件,并将其放置在一个 `tk.Frame` 中。然后,您可以创建一个 `tk.Scrollbar` 组件,并将其与 `tk.Canvas` 组件绑定在一起。最后,您需要配置 `tk.Canvas` 组件以使用垂直滚动条并启用滚动功能。
下面是添加垂直滚动条的示例代码:
``` python
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)
# 创建左侧面板
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, width=150, bg='lightcyan')
self.scrollbar = tk.Scrollbar(self.panel_left, orient=tk.VERTICAL, command=self.canvas.yview)
self.scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
self.canvas.pack(side=tk.LEFT, fill=tk.BOTH, expand=1)
self.canvas.config(yscrollcommand=self.scrollbar.set)
# 在 Canvas 中添加一些文本框
for i in range(100):
self.canvas.create_text(75, i*20, text=f"Text {i}", font=('Arial', 12))
```
在这个示例中,我们首先创建了一个 `tk.Canvas` 组件和一个 `tk.Scrollbar` 组件,并将它们添加到了左侧面板中。然后,我们将 `tk.Scrollbar` 组件的 `command` 属性设置为 `tk.Canvas` 组件的 `yview` 方法,这样当用户滚动滚动条时,`tk.Canvas` 组件就会相应地滚动。最后,我们使用 `tk.Canvas` 的 `create_text` 方法在 Canvas 中添加了一些文本框,以便测试滚动条是否正常工作。
注意,上述代码只是一个示例,您需要根据您的实际需求进行调整和修改。
阅读全文