如何解决tkinter-使用wm_manage和wm_forget停靠和取消停放框架
我在here中发现了以下内容:
WM管理和WM忘记命令可用于执行停靠 和窗户对接。
所以我在这段代码中尝试了tk docs和wm_manage:
import tkinter as tk
root = tk.Tk()
class MyFigure(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
self.master = master
self.bc = tk.Button(self,text='confi',command=lambda:self.configure(bg='red')
)
self.bmanage = tk.Button(self,text='manage',command = lambda:self.master.wm_manage(self)
)
self.bforget = tk.Button(self,text='forget',command = lambda:self.master.wm_forget(self)
)
self.bmanage.pack(side='left')
self.bc.pack(side='left')
self.bforget.pack(side='left')
mf = MyFigure(root)
mf.pack()
root.mainloop()
但是没有成功。因此,我阅读了更多的书,没有办法让我误会了:
顶级窗口小部件可以用作框架,并可以通过任何 使用wm忘记命令后,其他几何图形管理器。
所以我试图做这样的事情:
def _manage(self):
top = self.master.wm_manage(self)
print(top)
def _forget(self):
frame = self.master.wm_forget(self)
print(frame)
但是两者都返回None
。我在这里缺少什么吗?我在做什么错了?
解决方法
为了使wm_forget
正常工作,您应该传递一个顶层窗口作为参数。例如,如果您在类的构造函数中添加以下行:
self.top = tk.Toplevel()
self.top.title("Top level")
然后可以按以下方式调用方法:
self.master.wm_forget(self.top)
关于wm_manage
,您应该将要转换为独立顶层窗口的窗口小部件作为参数传递。请记住,您只能将此命令与frame
,labelframe
和toplevel
小部件一起使用。如果将此命令应用于主窗口Tk
,将不会发生任何事情。
将框架转换为顶层(按按钮manage
)并将其转换回框架(按按钮forget
)的完整示例:
import tkinter as tk
root = tk.Tk()
class MyFigure(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
self.master = master
self.bc = tk.Button(self,text='confi',command=lambda:self.configure(bg='red')
)
self.bmanage = tk.Button(self,text='manage',command = lambda:self._manage()
)
self.bforget = tk.Button(self,text='forget',command = lambda:self._forget()
)
self.bmanage.pack(side='left')
self.bc.pack(side='left')
self.bforget.pack(side='left')
self.frame = tk.Frame(self.master,bg="red",height=100)
self.label=tk.Label(self.frame,text="hi")
self.frame.pack()
self.label.pack(expand=True,fill=tk.BOTH)
def _manage(self):
test=self.master.wm_manage(self.frame)
def _forget(self):
self.master.wm_forget(self.frame)
self.frame.pack()
mf = MyFigure(root)
mf.pack()
root.mainloop()