如何在Tkinter中滚动浏览一组标签小部件?

问题描述 投票:0回答:1

我正在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的初学者!上面的代码以我想要的方式输出我的标签并将滚动条放在它们旁边,但它没有功能,也不会移动以显示剩余的小部件。我确定我犯了一个基本错误或省略了一些代码。我该如何纠正这个?

python tkinter grid scrollbar
1个回答
0
投票

您需要在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))
© www.soinside.com 2019 - 2024. All rights reserved.