基于此文:https://my.oschina.net/tinhome/blog/4953861
安装依赖
pip install PyGetWindowpip install pywin32
第一个子窗体实现


import tkinter as tkimport tkinter.ttk as ttkimport win32guiroot = tk.Tk()root.title("父窗体")root.geometry("1000x800+100+100")sub = tk.Toplevel(root)sub.title("子窗体")sub.geometry("400x300+100+100")def setP(event):pid = win32gui.FindWindow(None,u"父窗体")cid = win32gui.FindWindow(None,u"子窗体")win32gui.SetParent(cid,pid)root.bind("<Visibility>",setP)root.mainloop()
上面的代码中绑定了窗口的事件 <Visibility> ,当父窗体显示时再去设置Toplevel为子窗体。
在容器中显示子窗体


import tkinter as tkimport tkinter.ttk as ttkimport win32guiroot = tk.Tk()root.title("父窗体")root.geometry("1000x800+100+100")sub = tk.Toplevel(root)sub.title("子窗体")sub.geometry("400x300+100+100")frm = tk.Frame(root,bg = "gray",width = 500)frm.pack(side = tk.LEFT,fill =tk.Y,# expand =True)def setP(event):pid = frm.winfo_id()cid = win32gui.FindWindow(None,u"子窗体")win32gui.SetParent(cid,pid)root.bind("<Visibility>",setP)root.mainloop()
通过容器的 winfo_id() 可以直接获得容器的系统窗口ID,然后就可以在其中显示子窗体了

