(这个问题最初发布到 python-tkinter 邮件列表)
TL;TR 如何在 Windows 上从 HWND 设置 Tkinter 窗口的主控?
我在 Windows 上的嵌入式 Python 解释器中使用 Tkinter。有一个打开了主窗口的桌面 Win32 应用程序。嵌入式 Python 运行一个脚本,该脚本创建并显示一个 Tkinter 窗口。
有没有办法根据HWND
Win32 窗口分配 Tkinter 窗口的主(父)?
我想让 Tkinter 窗口相对于主 Win32 应用程序窗口成为一个完全模式的窗口。
我知道允许我查询 Tkinter 窗口的 Win32的winfo_*
API ,但似乎没有类似的功能来设置父级(或非 Windows 操作系统上的 id)。winfo_id()
HWND
HWND
我有一个粗略的想法是创建一个小的 Python 扩展,可从我的嵌入式 Python 中获得,并使用暴露的自定义函数覆盖HWND
Tkinter 窗口的父级,使用 Win32 SetParent
。
这是该想法的某种伪代码:
PyObject * mywin32_set_parent(PyObject *self, PyObject *args)
{
/* unpack Tkinter HWND from args */
HWND hTkinterWindow = ... ;
/* returns main application window */
HWND hAppWindow = GetMyAppWindow();
/* make the main window parent of the Tkinter */
::SetParent(hTkinterWindow, hAppWindow)
Py_INCREF(Py_None);
return Py_None;
}
然后在嵌入式 Python 执行的 Python 脚本代码中:
import mywin32
root = Tk()
hwnd = root.winfo_id()
# make root a child of the main application window overwriting its parent
mywin32.set_parent(hwnd)
为简化起见,我们假设设置 master from 的唯一目的HWND
是将 Tkinter 窗口相对于(或在顶部)HWND
分配为主窗口的位置。IOW,Tkniter 窗口的行为类似于非 Tkinter 窗口的模态对话框。
是否有任何 Tkinter 惯用的方式来实现这种行为?