Tkinter:如何在画布窗口中获取框架以扩展到画布的大小?

时间:2015-03-28 16:17:29

标签: python python-3.x tkinter tkinter-canvas

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

如果我在画布中使用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填充的画布(您可以看到右侧的滚动条):

谢谢!

2 个答案:

答案 0 :(得分:13)

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

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

答案 1 :(得分:11)

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