Как вставить таблицу treeview в сетку grid

Не могу понять, как расположить виджеты по окну, если один из них таблица? Как вставить таблицу treeview в сетку grid?

Мой код:

import tkinter as tk
from tkinter import ttk


class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()

    def init_main(self):
        self.label1 = tk.Label(root, width=25, font='Times 12', text='Список смежности вершин')
        self.label1.grid(row=0, column=0)

        self.tree = ttk.Treeview(self, columns=['vertex', 'adj_vertices'], height=15, show='headings')
        self.tree.column('vertex', width=100, anchor=tk.CENTER)
        self.tree.column('adj_vertices', width=250, anchor=tk.CENTER)
        self.tree.heading('vertex', text='Вершина')
        self.tree.heading('adj_vertices', text='Смежные ей вершины')
        self.tree.grid(row=1, column=0)

        self.label2 = tk.Label(root, width=35, font='Times 12', text='Введите вершину (до 3-ёх символов):')
        self.label2.grid(row=2, column=0)

        self.entry1 = tk.Entry(root, width=30, font='Times 12')
        self.entry1.grid(row=3, column=0)

        self.button1 = tk.Button(root, text='Добавить вершину')
        self.button1.grid(row=4, column=0)

        self.button2 = tk.Button(root, text='Удалить вершину')
        self.button2.grid(row=5, column=0)


if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    root.title("Graph representation")
    root.geometry("700x700+400+50")
    root.resizable(False, False)
    root.mainloop()

Но таблица почему-то не отображается...


Ответы (1 шт):

Автор решения: insolor

Вы создаете Main, но не размещаете его в окне root. tree у вас крепится к фрейму Main, поэтому его не видно, а остальные объекты - к root, поэтому их видно.

import tkinter as tk
from tkinter import ttk


class Main(tk.Frame):
    def __init__(self, root):
        super().__init__(root)
        self.init_main()

    def init_main(self):
        # Было tk.Label(root, ...) (root вместо self)
        self.label1 = tk.Label(self, width=25, font='Times 12', text='Список смежности вершин')
        self.label1.grid(row=0, column=0)

        self.tree = ttk.Treeview(self, columns=['vertex', 'adj_vertices'], height=15, show='headings')
        self.tree.column('vertex', width=100, anchor=tk.CENTER)
        self.tree.column('adj_vertices', width=250, anchor=tk.CENTER)
        self.tree.heading('vertex', text='Вершина')
        self.tree.heading('adj_vertices', text='Смежные ей вершины')
        self.tree.grid(row=1, column=0)

        # Было root вместо self:
        self.label2 = tk.Label(self, width=35, font='Times 12', text='Введите вершину (до 3-ёх символов):')
        self.label2.grid(row=2, column=0)

        # Было root вместо self:
        self.entry1 = tk.Entry(self, width=30, font='Times 12')
        self.entry1.grid(row=3, column=0)

        # Было root вместо self:
        self.button1 = tk.Button(self, text='Добавить вершину')
        self.button1.grid(row=4, column=0)

        # Было root вместо self:
        self.button2 = tk.Button(self, text='Удалить вершину')
        self.button2.grid(row=5, column=0)


if __name__ == "__main__":
    root = tk.Tk()
    app = Main(root)
    app.pack()  # <-- Main - это фрейм, его нужно разместить в окне
    root.title("Graph representation")
    root.geometry("700x700+400+50")
    root.resizable(False, False)
    root.mainloop()

Скриншот

→ Ссылка