使Tkinter窗口成为非Tkinter窗口的子窗口

mlo*_*kot 5 python user-interface winapi tkinter

(这个问题最初发布在python-tkinter邮件列表中)

TL; TR如何在Windows上从HWND设置Tkinter窗口的主设备?

我在Windows上使用嵌入式Python解释器中的Tkinter.有一个桌面Win32应用程序打开了一个主窗口.嵌入式Python运行一个脚本,用于创建和显示Tkinter窗口.

有没有办法根据HWNDWin32窗口分配Tkinter窗口的主(父)?

我想使Tkinter窗口成为主Win32应用程序窗口的完全模态窗口.

我知道winfo_*API winfo_id()允许我查询HWNDTkinter窗口的Win32 ,但似乎没有类似的功能来设置父级HWND(或非Windows操作系统上的ID).

我得到的一个有用的想法是创建一个小的Python扩展,可以从我的嵌入式Python中获得HWND,使用Win32 覆盖Tkinter窗口的父级,使用暴露的自定义函数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;
}
Run Code Online (Sandbox Code Playgroud)

然后在嵌入式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)
Run Code Online (Sandbox Code Playgroud)

为简化起见,我们假设设置主设备的唯一目的HWND是将Tkinter窗口相对(或在顶部)定位到HWND指定为主设备的窗口.IOW,Tkniter窗口的行为类似于非Tkinter窗口的模态对话框.

是否有任何Tkinter惯用的方式来实现这种行为?