Вы можете использовать функцию create_window на холсте, чтобы поместить на него рамку, а затем использовать эту рамку для обычной упаковки других виджетов.
import tkinter as tk
mw = tk.Tk()
canvas = tk.Canvas(mw, bg='grey75')
canvas.pack()
frame = tk.Frame(canvas, width=50, height=5)
canvas.create_window((1,1), window=frame, anchor='nw')
button = tk.Button(frame, text='Hello World')
button.pack()
mw.mainloop()