[英]Making Tkinter window a child of non-Tkinter window
(这个问题最初发布在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
覆盖Tkinter窗口父级的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惯用的方式来实现这种行为?
试试按钮:
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()
这就是我们得到的: 见图
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.