Как прокрутить группу виджетов ярлыков в Tkinter? - PullRequest
0 голосов
/ 14 апреля 2019

Я создаю тест в 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! Приведенный выше код выводит мои метки так, как я хочу, и размещает рядом с ними полосу прокрутки, но она не имеет никакой функциональности и не будет отображать оставшиеся виджеты. Я уверен, что я сделал основную ошибку или пропустил некоторый код. Как бы я исправить это?

1 Ответ

0 голосов
/ 15 апреля 2019

Вам необходимо создать еще один кадр внутри 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))
...