Tkinter 提供了用于垂直或水平滚动窗口的滚动条小部件。但是,滚动条界面只能与特定的小部件关联,例如List、Textbox、Canvas 和Entry。可以使用 window_create 方法将简单的垂直或水平小部件组放置在文本小部件内。然而,这种方法缺乏复杂布局的灵活性。
通用布局的更常见解决方案是使用带有关联滚动条的画布小部件。然后将小部件嵌入到放置在画布内的框架中。框架的宽度和高度应设置为与画布的滚动区域相匹配。
将小部件嵌入框架中允许使用 pack、place 或 grid 方法进行放置。这种方法确保框架内创建的所有项目都可以使用滚动条滚动。
或者,直接在画布上绘制文本元素也是可行的。行高和坐标可以根据字体和布局要求计算。使用列信息标记项目可以轻松调整跨列的 x 坐标和宽度。
这里是使用对象的框架嵌入画布解决方案的示例面向方法:
import tkinter as tk class Example(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent) self.canvas = tk.Canvas(self, borderwidth=0, background="#ffffff") self.frame = tk.Frame(self.canvas, background="#ffffff") self.vsb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview) self.canvas.configure(yscrollcommand=self.vsb.set) self.vsb.pack(side="right", fill="y") self.canvas.pack(side="left", fill="both", expand=True) self.canvas.create_window((4, 4), window=self.frame, anchor="nw", tags="self.frame") self.frame.bind("<Configure>", self.onFrameConfigure) self.populate() def populate(self): for row in range(100): tk.Label(self.frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t = "this is the second column for row %s" % row tk.Label(self.frame, text=t).grid(row=row, column=1) def onFrameConfigure(self, event): self.canvas.configure(scrollregion=self.canvas.bbox("all")) if __name__ == "__main__": root = tk.Tk() example = Example(root) example.pack(side="top", fill="both", expand=True) root.mainloop()
这是一个程序解决方案不使用类:
import tkinter as tk def populate(frame): for row in range(100): tk.Label(frame, text="%s" % row, width=3, borderwidth="1", relief="solid").grid(row=row, column=0) t = "this is the second column for row %s" % row tk.Label(frame, text=t).grid(row=row, column=1) def onFrameConfigure(canvas): canvas.configure(scrollregion=canvas.bbox("all")) root = tk.Tk() canvas = tk.Canvas(root, borderwidth=0, background="#ffffff") frame = tk.Frame(canvas, background="#ffffff") vsb = tk.Scrollbar(root, orient="vertical", command=canvas.yview) canvas.configure(yscrollcommand=vsb.set) vsb.pack(side="right", fill="y") canvas.pack(side="left", fill="both", expand=True) canvas.create_window((4, 4), window=frame, anchor="nw") frame.bind("<Configure>", lambda event, canvas=canvas: onFrameConfigure(canvas)) populate(frame) root.mainloop()
总之,虽然 Tkinter 的滚动条界面有局限性,但有多种方法可以将滚动条添加到一组小部件。通过了解这些方法,您可以有效地管理 Tkinter 窗口的显示和滚动。
以上是如何向 Tkinter 中的一组小部件添加滚动条?的详细内容。更多信息请关注PHP中文网其他相关文章!