我在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
答案 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(这是我要做的)来实现它。