基于此文:https://my.oschina.net/tinhome/blog/4953861

安装依赖

  1. pip install PyGetWindow
  2. pip install pywin32

第一个子窗体实现

image.pngimage.png

  1. import tkinter as tk
  2. import tkinter.ttk as ttk
  3. import win32gui
  4. root = tk.Tk()
  5. root.title("父窗体")
  6. root.geometry("1000x800+100+100")
  7. sub = tk.Toplevel(
  8. root
  9. )
  10. sub.title("子窗体")
  11. sub.geometry("400x300+100+100")
  12. def setP(event):
  13. pid = win32gui.FindWindow(None,u"父窗体")
  14. cid = win32gui.FindWindow(None,u"子窗体")
  15. win32gui.SetParent(cid,pid)
  16. root.bind("<Visibility>",setP)
  17. root.mainloop()

上面的代码中绑定了窗口的事件 <Visibility> ,当父窗体显示时再去设置Toplevel为子窗体。

在容器中显示子窗体

image.pngimage.png

  1. import tkinter as tk
  2. import tkinter.ttk as ttk
  3. import win32gui
  4. root = tk.Tk()
  5. root.title("父窗体")
  6. root.geometry("1000x800+100+100")
  7. sub = tk.Toplevel(
  8. root
  9. )
  10. sub.title("子窗体")
  11. sub.geometry("400x300+100+100")
  12. frm = tk.Frame(
  13. root,
  14. bg = "gray",
  15. width = 500
  16. )
  17. frm.pack(
  18. side = tk.LEFT,
  19. fill =tk.Y,
  20. # expand =True
  21. )
  22. def setP(event):
  23. pid = frm.winfo_id()
  24. cid = win32gui.FindWindow(None,u"子窗体")
  25. win32gui.SetParent(cid,pid)
  26. root.bind("<Visibility>",setP)
  27. root.mainloop()

通过容器的 winfo_id() 可以直接获得容器的系统窗口ID,然后就可以在其中显示子窗体了

image.png