我正在使用Gtk3编写带有图形用户界面的python应用程序。该程序将打开另一个应用程序,该应用程序本身具有显示一些信息的窗口。我想将此窗口重新添加到我自己的图形用户界面中,以便我只有一个窗口,而不是两个。到目前为止,我知道如何获取外部窗口的Gdk.Window实例,并且从理论上讲如何重定Gdk.Window的父级,但是它并不像预期的那样起作用。我制作了一个小示例应用程序来说明我的问题。
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import GdkX11
from gi.repository import Gdk
#create a new gtk window
win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
#xid of the extern window, can be determined with xwininfo
xid = 0x0000000
#get gdk window with xid
gdk_display = GdkX11.X11Display.get_default()
gdk_window = GdkX11.X11Window.foreign_new_for_display(gdk_display, xid)
#I need win.show_all() here because otherwise win.get_window() will return None
win.show_all()
#reparent the gdk window into my gtk window
gdk_window.reparent(win.get_window(), 0, 0)
gdk_window.show()
win.show_all()
Gtk.main()
例如,当我现在打开一个终端并在上面的程序中设置该终端的xid并运行它时,该终端将从屏幕上消失,但不会出现在我的应用程序中。 xwininfo在地图状态“ IsUnMapped”下输出,但是
gdk_window.is_viewable()
gdk_window.is_visible()
都返回True。
现在开始好奇的部分。当我打开一个终端并在其中运行类似htop的程序并重复上述过程时,首先一切看起来都一样。但是,当我关闭应用程序窗口时,它也想关闭终端。但是,仍然有htop正在运行,因此会弹出一个窗口,问我是否要关闭终端或取消终端。在这一点上,我按取消,以便使终端仍在运行,但没有窗口,并且我的python应用程序已终止。现在,我再次运行我的小python应用程序,一切都可以按我希望的方式运行,即终端显示在图形用户界面的窗口中。
但是我如何直接实现呢?