如何使Tkinter Python3.x嵌套网格?

时间:2019-08-02 18:17:33

标签: python tkinter tk grid-layout

我已经尝试了几天,以找出如何将网格放置在对象网格中。我有两个框架(我猜是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()调用或更改列的内容,显示都一样:

text "AAAAAAAAA" overlapping "top_level_test_label" in a window

如您所见,AAAAAAAA在父项的另一个小部件的顶部显示 ,理想情况下,它应该在所有内容的侧面显示

1 个答案:

答案 0 :(得分: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)
        ...