【问题标题】:expanding frame inside canvas with scrollbar to full window width tkinter使用滚动条将画布内的框架扩展到全窗口宽度 tkinter
【发布时间】:2021-11-26 16:20:19
【问题描述】:

我正在尝试以红色和滚动条的第一部分,整个绿色框架的宽度。然后将蓝色部分扩大到蓝色部分的整个宽度。 我正在使用嵌入在画布中的框架来获取该滚动条,因此它使整个过程复杂化。我的代码如下:

        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')

我尝试使用一些列配置来扩展它,但无济于事。

【问题讨论】:

标签: python tkinter tkinter-canvas


【解决方案1】:

由于画布和滚动条是self.invest_frame的子级,所以需要使用

root.columnconfigure(1, weight=1)

扩展self.invest_frame 以水平填充可用空间(绿色区域)。

要扩展blue 框架以填充画布宽度,您需要在更改画布大小时使用self.main_canvas.itemconfigure()self.second_frame 的宽度更改为self.main_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')))

【讨论】:

    猜你喜欢
    • 2015-06-01
    • 2022-01-09
    • 1970-01-01
    • 2016-06-06
    • 2020-03-17
    • 2021-09-28
    • 2018-02-04
    • 2012-04-03
    • 2015-04-18
    相关资源
    最近更新 更多