tkinter: usando barras de desplazamiento en un canvas

Estoy tratando de hacer un canvas desplazable. Sin embargo, una vez que trato de configurar barras de desplazamiento para trabajar con el canvas, tkinter parece ignorar completamente las dimensiones que establecí inicialmente para mi canvas. He intentado empaquetarlas todas en un marco, configurar el canvas para que llene el marco y luego configurar el tamaño del marco, pero eso presenta el mismo problema a menos que yo establezca el marco para llenar la ventana también, que no es lo que quiero . Básicamente, quiero un canvas de tamaño fijo con barras de desplazamiento en él. Mi código actual se ve así (en Python 3.1):

from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(canvas,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(canvas,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop() 

Las barras de desplazamiento deben tener el marco como elemento principal, no el canvas:

 from tkinter import * root=Tk() frame=Frame(root,width=300,height=300) frame.grid(row=0,column=0) canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) hbar=Scrollbar(frame,orient=HORIZONTAL) hbar.pack(side=BOTTOM,fill=X) hbar.config(command=canvas.xview) vbar=Scrollbar(frame,orient=VERTICAL) vbar.pack(side=RIGHT,fill=Y) vbar.config(command=canvas.yview) canvas.config(width=300,height=300) canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) canvas.pack(side=LEFT,expand=True,fill=BOTH) root.mainloop() 

La razón por la que esto funciona es debido a cómo funciona el pack . Por defecto, intentará reducir (o boost) un contenedor para que se ajuste exactamente a sus hijos. Debido a que las barras de desplazamiento son elementos secundarios del canvas en el ejemplo original, el canvas se reduce para encajar.

Si desea que aparezcan las barras de desplazamiento dentro del canvas, el truco consiste en utilizar un marco adicional. Coloque el canvas y las barras de desplazamiento en este marco interior, gire los bordes fuera del canvas y active el marco. Establezca que el fondo del marco sea el mismo que el canvas y aparecerá que las barras de desplazamiento están dentro del canvas.