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