2016-08-14 2 views
13

Ich fing an, eine GUI mit Glade-, python- und Gtk3-Bibliotheken zu bauen. Ich möchte versuchen, ein externes Fenster anzuzeigen, das es in einem Container in meiner GUI verbindet. Ist es möglich? Welches ist das beste Containerobjekt dafür?Wie man externes Fenster in GUI einbettet (Python + Glade + Gtk3)

Ich begann zu suchen, aber einfache Methoden in Gtk2 (wie here) können nicht mehr in Gtk3 verwendet werden.

Ich fand eine sehr interessante Post here, die mir erlauben, die richtige ID des Zielfensters zu setzen, aber ich bin immer noch verwirrt, wie es in meiner GUI angezeigt wird.

Ich habe versucht, ein wenig zu ändern these tutorials mit Kairo.

Mein Stück Code bisher (Ich möchte das Fenster mit ID = 0x360000b im map_area Container anzeigen und ich muss die "self." Handles Struktur verwenden). Vorübergehend ist der Bereich map_area ein Zeichenbereich.

# 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() 

Kann mir jemand helfen? Vielen Dank im Voraus!

+0

Werfen Sie einen Blick auf https://developer.gnome.org/gtk3/stable/GtkSocket.html - diese Lösung erfordert jedoch einige Zusammenarbeit von dem anderen Prozess. – Phillip

+0

Könnte es auch für die Einbettung ** externer ** Prozess funktionieren? Ich bin an einem Fenster interessiert, das in meinem Skript nicht als Widget generiert wurde. Es könnte sein, als ob ich das Ubuntu Terminalfenster oder das aktuelle Mozilla Firefox Browserfenster in ein richtiges Widget einbetten möchte (ich weiß nicht, welches es sein könnte) – marcoresk

+1

Sicher, das ist was die Dokumentation mit "anderen" meint verarbeiten. * Aber * der externe Prozess muss mit Ihrem zusammenarbeiten; Das heißt, es muss sein Top-Level-Fenster aktiv in dem von der GtkSocket erzeugten Fenster reparieren. Z. B. hat xterm die Option "-into" dafür. (Wenn Sie bereit sind, Xlib als eine Abhängigkeit zu Ihrem Skript hinzuzufügen, können Sie dies für die andere Anwendung tun. Ich werde eine Antwort mit einem Beispiel veröffentlichen.) – Phillip

Antwort

1

Es klingt, als ob Sie ein Fenstermanager sein möchten. Werfen Sie einen Blick auf die Antworten auf die Frage, wie ein Fenstermanager zu schreiben, wie diese:

Creating a window manager for Linux

oder diese:

Building a Window Manager

Viel Glück!

+0

Vielen Dank für die Antwort.In der Zwischenzeit habe ich diesen Teil meines Projekts gestoppt und bin nach einigen Überlegungen von GTK und Glade zu Qt-Creator gewechselt, aber ich werde es mir genau ansehen! – marcoresk

Verwandte Themen