6

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

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

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

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

我想让 Tkinter 窗口相对于主 Win32 应用程序窗口成为一个完全模式的窗口。

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

我有一个粗略的想法是创建一个小的 Python 扩展,可从我的嵌入式 Python 中获得,并使用暴露的自定义函数覆盖HWNDTkinter 窗口的父级,使用 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 惯用的方式来实现这种行为?

4

1 回答 1

1

尝试使用按钮:

from tkinter import *
def Test():
    Test = Toplevel()
main = Tk()
main.title("<Your title>")
main.geometry("400x400")
Button(main, text="<Your text>", command=Test).grid(row=0, column=0, sticky=W)
main.mainloop()

这就是我们得到的: 看图片

于 2019-05-02T12:24:42.817 回答