如何在Gtk3中获取DrawingArea窗口句柄?

时间:2014-04-11 19:44:54

标签: python gtk3 pygobject chromium-embedded

我在CEF Python 3(link

上获得此代码
    ...

    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.get_window之前调用: self.container.realize()。但我还没有得到Window Handle。

我需要将CEF3窗口放在DrawingArea或任何元素中。我怎么能用PyGI做到这一点?

编辑:


我的环境是:

Windows 7

Python 2.7和Python 3.2

3 个答案:

答案 0 :(得分:5)

可悲的是,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()

答案 1 :(得分:0)

您必须先导GdkX11 get_xid() GdkX11Window才能在返回的from gi.repository import GdkX11 ... -windowID = self.container.get_window().handle +windowID = self.container.get_window().get_xid() 上使用。

{{1}}

答案 2 :(得分:0)

答案建议您使用.handle.get_xid()适用于GTK2,但不适用于GTK3或MS Windows,这是您提问的一部分。

我已经做了很多挖掘,发现GTK3中有一个功能可以满足您的需求:gdk_win32_window_get_handle,但遗憾的是它在gi绑定中不可用。 您可以使用ctypes或Cython(这是我要做的)来实现它。