【问题标题】:How to embed external window in GUI (Python + Glade + Gtk3)如何在 GUI 中嵌入外部窗口(Python + Glade + Gtk3)
【发布时间】: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,但也许它可以帮助你!

标签: python gtk gtk3 glade


【解决方案1】:

听起来你想成为一个窗口管理器。查看有关如何编写窗口管理器的问题的答案,例如这个:

Creating a window manager for Linux

或者这个:

Building a Window Manager

祝你好运!

【讨论】:

  • 感谢您的回答。与此同时,我停止了这部分项目,经过一些考虑,我从 GTK 和 Glade 转移到了 Qt-creator,但我一定会看看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-21
  • 2016-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-15
相关资源
最近更新 更多