基于此文:https://my.oschina.net/tinhome/blog/4953861
安装依赖
pip install PyGetWindow
pip install pywin32
第一个子窗体实现
import tkinter as tk
import tkinter.ttk as ttk
import win32gui
root = 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 tk
import tkinter.ttk as ttk
import win32gui
root = 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,然后就可以在其中显示子窗体了