24

所以我一直在 tkinter 中使用画布小部件来创建一个充满标签的框架,该框架有一个滚动条。一切都很好,除了框架只扩展到放置在其中的标签的大小 - 我希望框架扩展到父画布的大小。

如果我对画布中的框架使用 pack(expand = True) (我已在下面的代码中注释掉),则可以轻松完成此操作,但随后滚动条不起作用。

这是适当的代码:

    ...
    self.canvas = Canvas(frame, bg = 'pink')
    self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)

    self.mailbox_frame = Frame(self.canvas, bg = 'purple')

    self.canvas.create_window((0,0),window=self.mailbox_frame, anchor = NW)

    #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)

    mail_scroll = Scrollbar(self.canvas, orient = "vertical",
        command = self.canvas.yview)
    mail_scroll.pack(side = RIGHT, fill = Y)

    self.canvas.config(yscrollcommand = mail_scroll.set)

    self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)


def OnFrameConfigure(self, event):
    self.canvas.configure(scrollregion=self.canvas.bbox("all"))

我还提供了带有彩色框架的图像,因此您可以看到我在做什么。粉色区域是需要通过mailbox_frame填充的画布(可以看到右边的滚动条):

4

3 回答 3

36

仅供将来参考,以防其他人需要知道:

        frame = Frame(self.bottom_frame)
        frame.pack(side = LEFT, fill = BOTH, expand = True, padx = 10, pady = 10)

        self.canvas = Canvas(frame, bg = 'pink')
        self.canvas.pack(side = RIGHT, fill = BOTH, expand = True)

        self.mailbox_frame = Frame(self.canvas, bg = 'purple')

        self.canvas_frame = self.canvas.create_window((0,0),
            window=self.mailbox_frame, anchor = NW)
        #self.mailbox_frame.pack(side = LEFT, fill = BOTH, expand = True)

        mail_scroll = Scrollbar(self.canvas, orient = "vertical", 
            command = self.canvas.yview)
        mail_scroll.pack(side = RIGHT, fill = Y)

        self.canvas.config(yscrollcommand = mail_scroll.set)

        self.mailbox_frame.bind("<Configure>", self.OnFrameConfigure)
        self.canvas.bind('<Configure>', self.FrameWidth)

    def FrameWidth(self, event):
        canvas_width = event.width
        self.canvas.itemconfig(self.canvas_frame, width = canvas_width)

    def OnFrameConfigure(self, event):
        self.canvas.configure(scrollregion=self.canvas.bbox("all"))
于 2015-03-28T20:49:00.800 回答
18

<Configure>在画布事件上设置绑定,当画布改变大小时触发该事件。从事件对象中,您可以获得画布的宽度和高度,并使用它来调整框架的大小。

于 2015-03-28T17:01:22.577 回答
0

只是一个更新的答案,它涵盖了水平和垂直滚动条而不会破坏它们。

def FrameWidth(self, event):
    if event.width > self.mailbox_frame.winfo_width():
        self.canvas.itemconfig(self.canvas_frame, width=event.width-4)
    if event.height > self.mailbox_frame.winfo_height():
        self.canvas.itemconfig(self.canvas_frame, height=event.height-4)

仅当框架高度和宽度小于画布宽度时才设置它们。尊重水平和垂直滚动条。

于 2022-01-12T17:15:33.343 回答