tkinter - 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()
解决方案
tkinter 不支持在框架内滚动小部件。唯一可垂直滚动的小部件是Text
、Canvas
、Listbox
和ttk.Treeview
小部件。
由于您使用place
的是按钮,因此您可以将按钮添加到画布,因为您可以将小部件定位在精确的坐标处。我在这个锅的末尾展示了一个例子。
如果您更喜欢使用grid
或pack
排列,请参阅在 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()
推荐阅读
- c++ - 如何在 Visual Studio C++ 中将年、月、日、时间转换为 UNIX 时间
- android - 如何从 PlacesAutocomplete 中的位置中选择值并将其存储在 TextFormField 中
- java - 给定一个双调数组,我们需要找到峰值元素
- javascript - 获取异步 TreeView 数据
- python - django rest 框架中是否有任何 request.forms 与 flask restful 一样?
- python-3.x - WxPython 特征属性网格
- mongodb - MongoDB - double $group 使第二个 ObjectID 成为嵌套文档
- jquery - jQuery animate() 是一个承诺吗?
- angular - 将图像存储在 Firebase 中,POST 404
- javascript - 如何在 HTML 中返回 json 对象值列表的总和