Tkinter: ¿Cómo obtener un marco en la ventana del canvas para expandir el tamaño del canvas?

Así que he estado usando el widget de canvas en tkinter para crear un marco lleno de tags que tiene una barra de desplazamiento. Todo funciona bien, excepto que el marco solo se expande al tamaño de las tags colocadas en él. Quiero que el marco se expanda al tamaño del canvas principal.

Esto se puede hacer fácilmente si uso pack (expand = True) (que he comentado en el código a continuación) para el marco en el canvas, pero luego la barra de desplazamiento no funciona.

Aquí está el bit de código apropiado:

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("", self.OnFrameConfigure) def OnFrameConfigure(self, event): self.canvas.configure(scrollregion=self.canvas.bbox("all")) 

También proporcioné una imagen con marcos de colores para que pueda ver a qué me refiero. El área rosa es el canvas que debe rellenarse con el buzón_frame (puede ver la barra de desplazamiento a la derecha):

Gracias

Establezca un enlace en el evento del canvas, que se activa cada vez que el canvas cambia de tamaño. Desde el objeto de evento puede obtener el ancho y la altura del canvas, y usarlo para cambiar el tamaño del marco.

Solo para futuras referencias en caso de que alguien más necesite saber:

  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("", self.OnFrameConfigure) self.canvas.bind('', 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"))