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

时间:2013-10-14 10:21:15

标签: python winapi user-interface tkinter

(这个问题是originally posted到python-tkinter邮件列表)

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

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

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

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

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

我得到的一个有用的想法是创建一个小的Python扩展,可以从我的嵌入式Python中获得,使用Win32 SetParent覆盖{1}} Tkinter窗口父级的外接自定义函数。

以下是该想法的某种伪代码:

HWND

然后在嵌入式Python执行的Python脚本代码中:

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;
}

为了简化,我们假设从import mywin32 root = Tk() hwnd = root.winfo_id() # make root a child of the main application window overwriting its parent mywin32.set_parent(hwnd) 设置主设备的唯一目的是将Tkinter窗口相对(或在顶部)定位到HWND被指定为主设备的窗口。 IOW,Tkniter窗口的行为类似于非Tkinter窗口的模态对话框。

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

1 个答案:

答案 0 :(得分: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()

这就是我们得到的: See the picture