tkinter 中框架的奇怪行为

Strange behavior of frames in tkinter

我有一个正在处理的项目,它需要我根据单击的按钮用新页面信息更新框架。

我的主页有2个框架。一帧包含按钮,另一帧将在单击按钮时更新。然而,当我点击一个按钮时,它会删除两个按钮并在第一帧上设置新页面。

我不明白这是怎么可能的,因为我检查了每一帧,它们应该是分开的。

当我 运行 test1.py 页面时,我按预期得到了这个 window:

然而,这是我按下其中一个按钮时得到的结果:

我应该会看到 2 个按钮仍然存在,标签现在位于按钮的右侧。我真的看不出这是怎么回事。

这是我的示例页面。

test1.py 包含:

import tkinter as tk
import test2
import test3

class TestApp(tk.Frame):

    def __init__(self, master, *args, **kwargs):
        tk.Frame.__init__(self, master, *args, **kwargs)
        self.button_frame = tk.Frame(self)
        self.button_frame.grid(row=0, column=0)
        self.working_frame = tk.Frame(self)
        self.working_frame.grid(row=0, column=1)

        tk.Button(self.button_frame, text="Test 2", command=lambda: self.update_main_frame("test2")).grid(row=0, column=0)
        tk.Button(self.button_frame, text="Test 3", command=lambda: self.update_main_frame("test3")).grid(row=1, column=0)


    def update_main_frame(self, window_name):
        if window_name == "test2":
            self.reset_working_frame()
            x = test2.TestFrame2(self.working_frame)
            x.grid(row=0, column=0, sticky="nsew")
        if window_name == "test3":
            self.reset_working_frame()
            x = test3.TestFrame3(self.working_frame)
            x.grid(row=0, column=0, sticky="nsew")

    def reset_working_frame(self):
        self.working_frame.destroy()
        self.working_frame = tk.Frame(self)
        self.working_frame.grid(row=0, column=1)



if __name__ == "__main__":
    root = tk.Tk()
    TestApp(root).grid(row=0, column=0, sticky="nsew")
    tk.mainloop()

test2.py 包含:

import tkinter as tk

class TestFrame2(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self)
        self.parent = parent
        self.internal_frame = tk.Frame(self)
        self.internal_frame.grid(row=0, column=0, sticky="nsew")

        tk.Label(text="some small label").grid(row=0, column=0)

test3.py 包含:

import tkinter as tk  

class TestFrame3(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self)
        self.parent = parent
        self.internal_frame = tk.Frame(self)
        self.internal_frame.grid(row=0, column=0, sticky="nsew")

        tk.Label(text="some larger label!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!").grid(row=0, column=0)

您没有为 TestFrame 或 Label 提供父框架,因此两者都默认为 root。试试这个:

class TestFrame2(tk.Frame):
    def __init__(self, parent):
        tk.Frame.__init__(self, parent) # add parent Frame
        self.parent = parent
        self.internal_frame = tk.Frame(self)
        self.internal_frame.grid(row=0, column=0, sticky="nsew")

        lbl = tk.Label(self.internal_frame, text="some small label") # add parent Frame
        lbl.grid(row=0, column=0)

此外,将初始化和布局放在同一行会导致错误。使用 2 行。