Как я могу получить дескриптор окна DrawingArea в Gtk3?
Я получаю этот код на CEF Python 3 ( ссылка)
...
self.container = gtk.DrawingArea()
self.container.set_property('can-focus', True)
self.container.connect('size-allocate', self.OnSize)
self.container.show()
...
windowID = self.container.get_window().handle
windowInfo = cefpython.WindowInfo()
windowInfo.SetAsChild(windowID)
self.browser = cefpython.CreateBrowserSync(windowInfo,
browserSettings={},
navigateUrl=GetApplicationPath('example.html'))
...
Этот код [self.container.get_window(). Handle] не работает с PyGI и GTK3.
Я пытаюсь перенести код с GTK2 на GTK3, как я могу это сделать?
Отредактировано:
После некоторого поиска я нашел совет, как заставить get_window работать: я вызываю: self.container.realize () перед self.container.get_window (). Но я пока не могу получить дескриптор окна.
Мне нужно поместить окно CEF3 внутри DrawingArea или любого элемента. Как я могу сделать это с PyGI?
Отредактировано:
Моя среда это:
Windows 7
Python 2.7 и Python 3.2
3 ответа
К сожалению, кажется, что нет никакого прогресса в интроспекции Python gobject, чтобы исправить это и сделать gdk_win32_window_get_handle
доступно (недавно сообщалось об ошибке в gnome bugtracker) - оно также необходимо для Python GStreamer и Windows ...
Поэтому я последовал предложению totaam и использовал ctypes для доступа к gdk_win32_window_get_handle. Взял меня навсегда, так как у меня не было никакого опыта с этим - и хорошо это как-то довольно уродливый хак - но хорошо, когда это необходимо...
Вот код:
Gdk.threads_enter()
#get the gdk window and the corresponding c gpointer
drawingareawnd = drawingarea.get_property("window")
#make sure to call ensure_native before e.g. on realize
if not drawingareawnd.has_native():
print("Your window is gonna freeze as soon as you move or resize it...")
ctypes.pythonapi.PyCapsule_GetPointer.restype = ctypes.c_void_p
ctypes.pythonapi.PyCapsule_GetPointer.argtypes = [ctypes.py_object]
drawingarea_gpointer = ctypes.pythonapi.PyCapsule_GetPointer(drawingareawnd.__gpointer__, None)
#get the win32 handle
gdkdll = ctypes.CDLL ("libgdk-3-0.dll")
hnd = gdkdll.gdk_win32_window_get_handle(drawingarea_gpointer)
#do what you want with it ... I pass it to a gstreamer videosink
Gdk.threads_leave()
Вы должны сначала импортировать GdkX11
за get_xid()
быть доступным на возвращенном GdkX11Window
,
from gi.repository import GdkX11
...
-windowID = self.container.get_window().handle
+windowID = self.container.get_window().get_xid()
Ответ, советующий вам использовать .handle
или же .get_xid()
работает на GTK2, но не на GTK3 или на MS Windows, которые являются частью вашего вопроса.
Я много покопался и обнаружил, что в GTK3 есть функция, которая делает то, что вы хотите: gdk_win32_window_get_handle
, но, к сожалению, это не доступно в привязках gi. Вы можете получить к нему доступ, используя ctypes или Cython (что я и собираюсь сделать).