Как я могу получить дескриптор окна 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 (что я и собираюсь сделать).

Другие вопросы по тегам