tkinter 不支持在框架内滚动小部件。唯一可垂直滚动的小部件是 Text、Canvas、Listbox 和 ttk.Treeview 小部件。
由于您使用place 作为按钮,因此您可以将按钮添加到画布,因为您可以将小部件定位在精确的坐标处。我已经在这个锅的末尾展示了一个例子。
如果您更喜欢使用grid 或pack 进行排列,请参阅Adding a scrollbar to a group of widgets in Tkinter,它展示了如何将按钮放入框架中,将框架放入画布中,然后将框架滚动为画布的一部分.
如果您想通过将小部件直接添加到画布来将它们放置在特定坐标处,请按照以下步骤操作。
from tkinter import *
root = Tk()
root.geometry("555x350")
canvas = Canvas(root)
vsb = Scrollbar(root, orient="vertical", command=canvas.yview)
hsb = Scrollbar(root, orient="horizontal", command=canvas.xview)
root.grid_rowconfigure(0, weight=1)
root.grid_columnconfigure(0, weight=1)
canvas.configure(xscrollcommand=hsb.set, yscrollcommand=vsb.set)
canvas.grid(row=0, column=0, sticky="nsew")
vsb.grid(row=0, column=1, sticky="ns")
hsb.grid(row=1, column=0, sticky="ew")
b1 = Button(canvas, text="Sample button 1")
b2 = Button(canvas, text="Sample button 1")
b3 = Button(canvas, text="Sample button 1")
b4 = Button(canvas, text="Sample button 1")
b5 = Button(canvas, text="Sample button 1")
b6 = Button(canvas, text="Sample button 1")
b7 = Button(canvas, text="Sample button 1")
b8 = Button(canvas, text="Sample button 1")
canvas.create_window(0, 0, anchor="nw", window=b1)
canvas.create_window(0, 30, anchor="nw", window=b2)
canvas.create_window(0, 90, anchor="nw", window=b3)
canvas.create_window(0, 160, anchor="nw", window=b4)
canvas.create_window(0, 334, anchor="nw", window=b5)
canvas.create_window(120, 0, anchor="nw", window=b6)
canvas.create_window(230, 0, anchor="nw", window=b7)
canvas.create_window(472, 0, anchor="nw", window=b8)
canvas.bind("<Configure>", lambda event: canvas.configure(scrollregion=canvas.bbox("all")))
root.mainloop()