Python Tkinter pack.forget()问题

Python Tkinter pack.forget()问题,python,tkinter,pack,Python,Tkinter,Pack,我正在尝试将一些UI代码移动到一个类中,然后多次调用该类以生成不同的屏幕。我将这些屏幕打包到一个外部框架中,我有一些导航按钮来忘记/打包这些框架,以便一次只显示一个 然而,pack_forget()实际上并没有隐藏任何东西。即使我.pack()然后.pack\u()立即忘记一个帧,它仍然在那里 在早期版本中,我可以使用grid_forget()来完成类似的操作,但现在我更喜欢.pack,并希望转换为.pack 谢谢 import tkinter as tk class Window(tk.F

我正在尝试将一些UI代码移动到一个类中,然后多次调用该类以生成不同的屏幕。我将这些屏幕打包到一个外部框架中,我有一些导航按钮来忘记/打包这些框架,以便一次只显示一个

然而,pack_forget()实际上并没有隐藏任何东西。即使我.pack()然后.pack\u()立即忘记一个帧,它仍然在那里

在早期版本中,我可以使用grid_forget()来完成类似的操作,但现在我更喜欢.pack,并希望转换为.pack

谢谢

import tkinter as tk


class Window(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)

  # first screen
        self.screen_01 = tk.Frame(master)
        self.screen_01.pack(fill = tk.BOTH, expand = 1)
        self.screen_01.configure(background = "yellow")

        # screen nav menu
        self.screen_01_nav_frame = tk.Frame(self.screen_01)
        self.screen_01_nav_frame.pack(fill = tk.X)
        self.screen_01_nav_frame.configure(background = "orange")

        #screen twin text areas
        self.screen_01_double_text_frame = tk.Frame(self.screen_01)
        self.screen_01_double_text_frame.pack(fill = tk.X)
        self.screen_01_double_text_frame.configure(background = "brown")

        # screen single text area
        self.screen_01_single_text_frame = tk.Frame(self.screen_01)
        self.screen_01_single_text_frame.pack(fill = tk.BOTH)
        self.screen_01_single_text_frame.configure(background = "pink")

        # Labels & buttons packed into frame 1a of frame 1
        self.label1a1 = tk.Label(self.screen_01_nav_frame, text = "label1", width = 20, height = 2)
        self.label1a1.config(bg = "green")
        self.label1a1.pack(side = tk.LEFT)

        self.label1a2 = tk.Label(self.screen_01_nav_frame, text = "label2", width = 20, height = 2)
        self.label1a2.config(bg = "green")
        self.label1a2.pack(side = tk.LEFT)

        self.label1a3 = tk.Label(self.screen_01_nav_frame, text = "label3", width = 20, height = 2)
        self.label1a3.config(bg = "green")
        self.label1a3.pack(side = tk.LEFT)

        self.label1a4 = tk.Label(self.screen_01_nav_frame, text = "label4", width = 20, height = 2)
        self.label1a4.config(bg = "green")
        self.label1a4.pack(side = tk.LEFT)

        # two text areas packed into frame 1b of frame 1
        self.text1b1 = tk.Text(self.screen_01_double_text_frame, wrap=tk.WORD, bg="blue", bd=2, relief = "ridge", height = 20)
        self.text1b1.pack(side = tk.LEFT, fill = tk.X, expand=1)
        self.text1b1.delete(1.0, tk.END)
        self.text1b1.insert(tk.END,"Frame 1 text area 1\n")  

        self.text1b2 = tk.Text(self.screen_01_double_text_frame, wrap=tk.WORD, bg="blue", bd=2, relief = "ridge", height = 20)
        self.text1b2.pack(side = tk.LEFT, fill = tk.X, expand=1)
        self.text1b2.delete(1.0, tk.END)
        self.text1b2.insert(tk.END,"Frame 1 text area 2\n")

        # two text areas packed into frame 1b of frame 1
        self.text1c = tk.Text(self.screen_01_single_text_frame, wrap=tk.WORD, bg="white", bd=2, relief = "ridge", height = 20)
        self.text1c.pack(side = tk.LEFT, fill = tk.BOTH, expand=1)
        self.text1c.delete(1.0, tk.END)
        self.text1c.insert(tk.END,"Frame 1 text area 2\n")        

def switch_mode(display_window):
    print(display_window)
    for window in [main_GUI.window1, main_GUI.window2]:
        window.pack_forget()
    display_window.pack()


# init GUI
class GUI:

    def __init__(self, master):
        self.autorun = 0
        self.master = master
        # weighting
        pixel = tk.PhotoImage(width=1, height=1)

        class NavButton(tk.Button):
            def __init__(self, *args, **kwargs):
                tk.Button.__init__(self, *args, **kwargs)
                self['bg'] = "#0070FF"
                self['image'] = pixel
                self['height'] = 45
                self['compound'] = 'c'
                self['fg'] = 'white'
                self['font'] = ('bold', '11')

        # outermost frame
        self.top_nav_frame = tk.Frame(master)
        self.top_nav_frame.pack(fill = tk.X)
        self.top_nav_frame.configure(background = "black")

        # top nav menu
        self.screen1_btn = NavButton(self.top_nav_frame, text="Startup", command = lambda : switch_mode(self.window1))
        self.screen1_btn.config(bg = "darkblue")
        self.screen1_btn.pack(side = tk.LEFT, expand=1, fill = tk.X)

        self.screen2_btn = NavButton(self.top_nav_frame, text="Manage DCF", command = lambda : switch_mode(self.window2))
        self.screen2_btn.config(bg = "darkblue")
        self.screen2_btn.pack(side = tk.LEFT, expand=1, fill = tk.X)

        self.label0c = tk.Label(self.top_nav_frame, text = "0c", height = 2)
        self.label0c.config(bg = "darkblue")
        self.label0c.pack(side = tk.LEFT, expand=1, fill = tk.X)

        self.label0d = tk.Label(self.top_nav_frame, text = "0d", height = 2)
        self.label0d.config(bg = "darkblue")
        self.label0d.pack(side = tk.LEFT, expand=1, fill = tk.X)

         # create the windoes from the window class       
        self.window1 = Window(master)
        self.window2 = Window(master)

#       forget doesn't even work if I call it directly on a window right after I create it       
        self.window1.pack_forget()


root = tk.Tk()
main_GUI = GUI(root)
root.mainloop()

看起来窗口没有包含任何内容,因为
screen\u 01
root
的直接子级。请尝试使用
self.screen\u 01=tk.Frame(self)
而不是
self.screen\u 01=tk.Frame(master)
。请尝试将此代码减少到最小值。如果问题在于打包和忘记一个框架,那么我们不需要几十个其他小部件。仅一个或两个其他小部件就足以说明问题。您的
类窗口(tk.Frame)
已准备好类型
Frame
。因此,您不需要再次添加
self.screen\u 01=tk.Frame(master)
。更改为
self.screen\u 01=self
。您可以执行
.configure(background=“yellow”)
而不是
.init(self,master,background=“yellow”)
。看起来窗口没有包含任何内容,因为
screen\u 01
root
的直接子级。请尝试使用
self.screen\u 01=tk.Frame(self)
而不是
self.screen\u 01=tk.Frame(master)
。请尝试将此代码减少到最小值。如果问题在于打包和忘记一个框架,那么我们不需要几十个其他小部件。仅一个或两个其他小部件就足以说明问题。您的
类窗口(tk.Frame)
已准备好类型
Frame
。因此,您不需要再次添加
self.screen\u 01=tk.Frame(master)
。更改为
self.screen\u 01=self
。除了
.configure(background=“yellow”)
之外,您还可以执行
初始化(self,master,background=“yellow”)