Как заставить Tkinter Python3.x вкладывать сетки?

В течение нескольких дней я пытался придумать, как просто поместить сетки в сетки объектов. У меня есть два фрейма (которые, я полагаю, являются виджетами в Tk?). Я добавляю один к другому, но положение виджетов его, похоже, не соответствует родительским виджетам (и он просто перезаписывает их).

вот мой MCVE

import tkinter as tk
class TestDoubleNested(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.grid()
        self.test_label = tk.Label(text="AAAAAAAAA")
        self.test_label.grid(row=0, column=0)

class TestNested(tk.Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.grid()
        self.test_label = tk.Label(text="top_level_test_label")
        self.test_label.grid(row=0, column=0)
        self.test_label2 = tk.Label(text="top_level_test_label2")
        self.test_label2.grid(row=0, column=1)
        # expected to be in 3rd column...
        self.test = TestDoubleNested(master)
        self.test.grid(row=0, column=4)


test = TestNested()
test.master.title("Test Example")
test.master.maxsize(1000, 400)
test.master.wm_geometry("400x300")

test.mainloop()

Независимо от того, как я перемещаюсь по вызовам self.grid () или меняю содержимое столбца, отображение остается прежним:

текст AAAAAAAAA перекрывает top_level_test_label в окне

Как видите, AAAAAAAA отображает поверх другого виджета из родительского элемента, где в идеале он должен отображаться сбоку от всего.


person Krupip    schedule 02.08.2019    source источник


Ответы (1)


Вы не указываете master для каждого виджета, поэтому все они добавляются в корневое окно. Если вы хотите, чтобы виджеты находились внутри фреймов, вы должны указать фрейм в качестве первого аргумента при создании виджетов:

class TestDoubleNested(tk.Frame):
    def __init__(self, master=None):
        ...
        self.test_label = tk.Label(self, text="AAAAAAAAA")
        ...


class TestNested(tk.Frame):
    def __init__(self, master=None):
        ...
        self.test_label = tk.Label(self, ...)
        self.test_label2 = tk.Label(self, ...)
        self.test = TestDoubleNested(self)
        ...
person Bryan Oakley    schedule 02.08.2019
comment
Вау, я не уверен, почему половина руководств настаивает на том, чтобы этого не делать, я понятия не имел, как это работает, я предполагал, что существует некий неявный механизм, управляющий родителями. - person Krupip; 02.08.2019
comment
@opa: вы можете показать мне ссылку на учебник, в котором это сказано? Я никогда не видел учебника, в котором не указывалось бы мастера. - person Bryan Oakley; 02.08.2019