使用滚动条将 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')))