赞
踩
在我之前的这篇纯tkinter创建嵌套子窗口的文章中,只提及了3种方法,原因就是,那三种方法都是建立在相对高层的代码上的。而这次需要使用系统(Windows)的底层api,来创建真正意义上的嵌套子窗口。
需要注意的是,这次的子窗口是完全真正的窗口,也就是tkinter的子窗口功能全开。不过,这篇文章并不是由纯tkinter实现。
我们没必要去寻找 Windows-api,已经有人帮我们弄好了,这次需要用到 win32gui (下载 pywin32 就可以了)。除了单独下载 pywin32,在测试阶段还需要使用 pygetwindow,用 pip install PyGetWindow 就可以了。
win32gui已经给出了方法,如下:
import win32gui
import pygetwindow as gw
hwnd = win32gui.FindWindow(None, u"窗口名称")
然而在测试就阶段,有些窗口的标题很难准确确定,那么就要使用 pygetwindow 了。
titles = gw.getAllTitles()
print(titles)
同样的,pygetwindow 也提供了通过标题一个获取窗口句柄的方式。
import re
pidinfo=gw.getWindowsWithTitle("窗口标题")[0]
print(pidinfo)
pid=re.findall('hWnd=(\d+)',str(pidinfo))[0]#之后要用 int() 从字符串转为整数
tkinter窗口用这两种可能会不准或出错。
窗口显示前,使用 tkinter窗口以及组件自带的 winfo_id()。
窗口显示后,使用以上两种方法
在这里不得不感叹 win32gui 的强大,使用 SetParent 函数就可以做到。
#pid: 父窗口句柄
#cid: 子窗口句柄
win32gui.SetParent(cid,pid)
在窗口创建后再嵌套,子窗口显示速度可能会有点慢,而且不知道边框为什么是 Windows7(Visita)的样式
一行代码直接搞定,太感人了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。