【问题标题】:Making Tkinter window a child of non-Tkinter window使 Tkinter 窗口成为非 Tkinter 窗口的子窗口
【发布时间】:2013-10-21 21:25:54
【问题描述】:

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

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

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

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

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

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

我有一个粗略的想法是创建一个小的 Python 扩展,可从我的嵌入式 Python 中获得,并使用 Win32 SetParent 覆盖 Tkinter Windows 父级的 HWND 的公开自定义函数。

这是这个想法的某种伪代码:

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)

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

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

【问题讨论】:

  • 您尝试过使用 Toplevels 吗?
  • @DanielAlexander 不,我不这么认为。
  • 看看他们,他们可能就是你要找的。​​span>

标签: python winapi user-interface tkinter


【解决方案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

【讨论】:

  • 很抱歉,但我不清楚您的示例与我在 Windows 上从 HWND 设置 Tkinter 窗口主控的问题有何关系。从您的代码示例来看,它并不生动。恕我直言,您的答案需要澄清。
猜你喜欢
  • 2013-09-18
  • 2021-10-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-11
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多