【发布时间】:2016-08-14 18:42:57
【问题描述】:
我开始使用 Glade、python 和 Gtk3 库构建 GUI。 我想尝试在我的 GUI 中查看将其链接到容器内的外部窗口。是否可以?执行此操作的最佳容器对象是哪个?
我开始搜索,但 Gtk2 中的简单方法(如 here)在 Gtk3 中无法再使用。
我发现了一个非常有趣的帖子here,它允许我设置目标窗口的正确 ID,但我仍然对如何在我的 GUI 中显示它感到困惑。
我尝试用 cairo 更改一点 these tutorials 失败了。
到目前为止我的一段代码(我想在 map_area 容器中显示 ID = 0x360000b 的窗口,我必须使用“self.”句柄结构)。 map_area 容器暂时是一个 Drawingarea。
# if condition occurs
Gdk.Window.process_all_updates()
win_id = 0x360000b # from xwininfo command
root_win = GdkX11.X11Display.get_default()
win = GdkX11.X11Window.foreign_new_for_display(root_win, win_id)
width = win.get_width()
height = win.get_height()
self.map_area = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
pixbuf = Gdk.pixbuf_get_from_window(win, 0, 0, width, height)
cr = cairo.Context(self.map_area)
Gdk.cairo_set_source_pixbuf(cr, pixbuf, 0, 0)
cr.paint()
谁能帮帮我? 提前谢谢!
【问题讨论】:
-
看看developer.gnome.org/gtk3/stable/GtkSocket.html - 不过这个解决方案需要其他进程的一些合作。
-
即使嵌入外部进程也能工作吗?我对在我的脚本中未作为小部件生成的窗口感兴趣。可能就像我想将 Ubuntu 终端窗口或当前的 Mozilla Firefox 浏览器窗口嵌入到我的 gtk 主窗口中的适当小部件(我不知道它可能是哪个)中
-
当然,这就是文档中“其他”过程的含义。 但是外部流程需要配合你的;也就是说,它必须主动将其顶级窗口重新设置为由 GtkSocket 创建的窗口。例如,xterm 对此有
-into选项。 (如果您愿意将 Xlib 作为依赖项添加到您的脚本中,您可以为其他应用程序执行此操作。我将通过示例发布答案。) -
(事实证明,reparenting 不是那容易。有
XReparentWindow,您还可以通过窗口的reparent函数从GdkX11 访问该函数,但如果尝试重新设置一个已经可见的窗口,至少 xterm 会退出。所以我不会有任何例子,抱歉。) -
我前段时间尝试过这个,但在遇到像你这样的问题时,我最终走向了一个不同的方向。我最终需要的只是应用程序的屏幕截图,所以我写了一些东西来抓取窗口的屏幕截图,特别是根据 Mac 和 Linux 的窗口标题。它还使用 X11 和 Quartz 来完成所有繁重的工作,因此它实际上非常快。存储库位于此处:github.com/Kush131/PyFastCap。它非常丑陋和hacky,但也许它可以帮助你!