使用滚动条将 canvas 内的框架扩展到全 window 宽度 tkinter
expanding frame inside canvas with scrollbar to full window width tkinter
我正在尝试在红色和滚动条的第一部分,绿色框架的整个宽度。然后将蓝色部分扩展到蓝色部分的整个宽度。
我正在使用嵌入在 canvas 中的框架来获取滚动条,因此它使整个过程复杂化。我的代码如下所示:
self.invest_frame = Frame(root)
root.config(background='green')
self.invest_frame.grid(row=0, column=1, rowspan=2,columnspan=1, sticky='news')
#root.columnconfigure(1, weight=0)
self.invest_frame.config(background='blue')
self.invest_frame.columnconfigure(1,weight=432)
self.main_canvas = Canvas(self.invest_frame)
self.main_canvas.pack(side=LEFT, fill=BOTH, expand=1)
self.main_canvas.config(background='red')
self.scrollbar = ttk.Scrollbar(self.invest_frame, orient=VERTICAL, command=self.main_canvas.yview)
self.scrollbar.pack(side=LEFT, fill = Y,anchor=W)
self.main_canvas.configure(yscrollcommand=self.scrollbar.set)
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))
self.main_canvas.configure(scrollregion=self.main_canvas.bbox("all"))
self.second_frame = Frame(self.main_canvas)
self.main_canvas.columnconfigure(0,weight=1)
self.second_frame.config(background='blue')
self.main_canvas.create_window((0, 0), window=self.second_frame, anchor='nw')
我试过配置一些列来扩展它,但无济于事。
由于 canvas 和滚动条是 self.invest_frame
的子项,您需要使用
root.columnconfigure(1, weight=1)
展开self.invest_frame
以水平填充space(绿色区域)。
要扩展 blue
框架以填充 canvas 宽度,您需要使用 [=19= 将 self.second_frame
的宽度更改为 self.main_canvas
的宽度] 每当 canvas 的大小发生变化时:
# save the item ID
self.second_frame_id = self.main_canvas.create_window((0, 0), window=self.second_frame, anchor='nw')
# expand self.second_frame to fill canvas width
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.itemconfigure(self.second_frame_id, width=e.width))
另请注意以下行:
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))
应该改为
self.second_frame.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))
我正在尝试在红色和滚动条的第一部分,绿色框架的整个宽度。然后将蓝色部分扩展到蓝色部分的整个宽度。 我正在使用嵌入在 canvas 中的框架来获取滚动条,因此它使整个过程复杂化。我的代码如下所示:
self.invest_frame = Frame(root)
root.config(background='green')
self.invest_frame.grid(row=0, column=1, rowspan=2,columnspan=1, sticky='news')
#root.columnconfigure(1, weight=0)
self.invest_frame.config(background='blue')
self.invest_frame.columnconfigure(1,weight=432)
self.main_canvas = Canvas(self.invest_frame)
self.main_canvas.pack(side=LEFT, fill=BOTH, expand=1)
self.main_canvas.config(background='red')
self.scrollbar = ttk.Scrollbar(self.invest_frame, orient=VERTICAL, command=self.main_canvas.yview)
self.scrollbar.pack(side=LEFT, fill = Y,anchor=W)
self.main_canvas.configure(yscrollcommand=self.scrollbar.set)
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))
self.main_canvas.configure(scrollregion=self.main_canvas.bbox("all"))
self.second_frame = Frame(self.main_canvas)
self.main_canvas.columnconfigure(0,weight=1)
self.second_frame.config(background='blue')
self.main_canvas.create_window((0, 0), window=self.second_frame, anchor='nw')
我试过配置一些列来扩展它,但无济于事。
由于 canvas 和滚动条是 self.invest_frame
的子项,您需要使用
root.columnconfigure(1, weight=1)
展开self.invest_frame
以水平填充space(绿色区域)。
要扩展 blue
框架以填充 canvas 宽度,您需要使用 [=19= 将 self.second_frame
的宽度更改为 self.main_canvas
的宽度] 每当 canvas 的大小发生变化时:
# save the item ID
self.second_frame_id = self.main_canvas.create_window((0, 0), window=self.second_frame, anchor='nw')
# expand self.second_frame to fill canvas width
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.itemconfigure(self.second_frame_id, width=e.width))
另请注意以下行:
self.main_canvas.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))
应该改为
self.second_frame.bind('<Configure>', lambda e: self.main_canvas.configure(scrollregion=self.main_canvas.bbox('all')))