首页 > 解决方案 > tkinter 中的可滚动按钮

问题描述

我已经在 python tkinter 中编写了这段代码,但我想添加一个垂直和水平滚动条,以便我可以垂直和水平滚动我的按钮。我只想要一个简单的,以便作为初学者我可以彻底理解它。任何帮助表示赞赏。

from tkinter import *

root = Tk()

root.geometry("555x350")

b = Button(root, text="Sample button 1")
b.place(x=0, y=0)

b = Button(root, text="Sample button 1")
b.place(x=0, y=30)

b = Button(root, text="Sample button 1")
b.place(x=0, y=90)


b = Button(root, text="Sample button 1")
b.place(x=0, y=160)


b = Button(root, text="Sample button 1")
b.place(x=0, y=334)

b = Button(root, text="Sample button 1")
b.place(x=120, y=0)


b = Button(root, text="Sample button 1")
b.place(x=230, y=0)


b = Button(root, text="Sample button 1")
b.place(x=472, y=0)

root.mainloop()

标签: tkinterbuttonscrollbar

解决方案


tkinter 不支持在框架内滚动小部件。唯一可垂直滚动的小部件是TextCanvasListboxttk.Treeview小部件。

由于您使用place的是按钮,因此您可以将按钮添加到画布,因为您可以将小部件定位在精确的坐标处。我在这个锅的末尾展示了一个例子。

如果您更喜欢使用gridpack排列,请参阅在 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()

推荐阅读