首页 > 解决方案 > 如何在 Tkinter 中滚动浏览一组标签小部件?

问题描述

我正在 Tkinter 中创建一个测验,目前正在研究一个框架来显示来自 SQLite 数据库的记录,我想以“表格”格式显示该记录。我已经创建了一组标签,它们将充当我的“表格”,但无法成功实现滚动条。

我知道滚动条不能直接与框架一起使用,我需要创建一个画布并将所有小部件附加到它。我试图通过论坛上给出的一些解决方案,但无法将它们与我自己的代码正确集成。目前,我创建的滚动条不起作用。

class Progress(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.___init__(self, parent)
        frametwo = Frame(self) #creates a secondary frame for the canvas?
        frametwo.grid(row = 2, column = 0)

        #attempts to create a functional scroll bar
        text_area = tk.Canvas(frametwo)
        vscroll = tk.Scrollbar(text_area, orient="vertical", command = text_area.yview)
        text_area['yscrollcommand'] = vscroll.set
        text_area.grid(row=2, column=0, sticky=tk.N+tk.S+tk.E+tk.W)
        vscroll.grid(row=2, column=6, sticky="nsew")
        text_area.configure(scrollregion = text_area.bbox("all"))

        #creates the label widgets
        self._widgets = []; columns = 6
        for row in range(0,11):
            current_row = []
            for column in range(columns):
                label = tk.Label(text_area, text="%s/%s" % (row, column), 
                                 borderwidth=0, width=10, height =2 )
                label.config(bg = "White", font=("Calibri bold", 20))
                label.grid(row =(row+2), column=column, sticky="nsew", padx=1, pady=1)
                current_row.append(label)
            self._widgets.append(current_row)

        for column in range(columns):
            self.grid_columnconfigure(column, weight=1)

抱歉,如果代码不清楚/效率低下,我是使用 tkinter 的初学者!上面的代码以我想要的方式输出我的标签并在它们旁边放置一个滚动条,但它没有功能并且不会移动以显示剩余的小部件。我确定我犯了一个基本错误或省略了一些代码。我将如何纠正这个问题?

标签: pythontkintergridscrollbar

解决方案


您需要在您的内部制作另一个框架canvas,然后使用它canvas.create_window来创建框架。标签小部件应该进入该框架内。

class Progress(tk.Frame):
    def __init__(self, parent, controller):
        tk.Frame.__init__(self, parent)
        frametwo = tk.Frame(self) #creates a secondary frame for the canvas?
        frametwo.grid(row = 2, column = 0)

        #attempts to create a functional scroll bar
        canvas = tk.Canvas(frametwo)
        canvas_frame = tk.Frame(canvas)
        vscroll = tk.Scrollbar(frametwo, orient="vertical", command = canvas.yview)
        canvas['yscrollcommand'] = vscroll.set
        canvas.grid(row=2, column=0, sticky=tk.N+tk.S+tk.E+tk.W)
        vscroll.grid(row=2, column=6, sticky="nsew")

        #creates the label widgets
        self._widgets = []; columns = 6
        for row in range(0,11):
            current_row = []
            for column in range(columns):
                label = tk.Label(canvas_frame, text="%s/%s" % (row, column),
                                 borderwidth=0, width=10, height =2 )
                label.config(bg = "White", font=("Calibri bold", 20))
                label.grid(row =(row+2), column=column, sticky="nsew", padx=1, pady=1)
                current_row.append(label)
            self._widgets.append(current_row)

        for column in range(columns):
            self.grid_columnconfigure(column, weight=1)

        canvas.create_window((0, 0), window=canvas_frame, anchor='nw')
        canvas_frame.bind("<Configure>", lambda e: canvas.configure(scrollregion = canvas.bbox("all"),width=450,height=300))

推荐阅读