tkinter中帧的奇怪行为

时间:2018-04-16 21:51:06

标签: python tkinter tkinter-layout

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

主页面中有2个框架。一个框架保持按钮,另一个框架按钮点击更新。但是,当我点击一个按钮时,它会连接两个按钮并在第一帧上设置新页面。

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

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

enter image description here

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

enter image description here

我应该看到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)

1 个答案:

答案 0 :(得分:2)

您没有向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行。