Как перевести окно Gdk в окно Gtk? - PullRequest
0 голосов
/ 14 января 2019

Я пишу приложение на Python с графическим интерфейсом пользователя, используя Gtk3. Программа открывает другое приложение, в котором есть окно для отображения некоторой информации. Я хочу перевести это окно в свой графический интерфейс, чтобы у меня было только одно окно вместо двух. До сих пор я знаю, как получить экземпляр 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, и все работает так, как я хочу, то есть терминал появляется в окне моего графического интерфейса пользователя.

Но как мне достичь этого напрямую?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...