Sockets funktionieren nicht wenn sie als Notebook-Seiten erstellt werden und diese dann verschoben werden

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
bent93
User
Beiträge: 2
Registriert: Mittwoch 24. Juli 2019, 09:38

Hi,
Ich arbeite mit PyGTK 3.0 auf Python3.7.
Momentan baue ich eine GUI, die aus mehreren Notebooks besteht, deren Seiten zwischen den Notebooks mit drag-and-drop herumgeschoben werden können. Das funktioniert ganz einfach mit Gtk.Notebook() wobei man alle Notebooks in die selbe Gruppe gibt und tab_detachable setzt. MIr normalen Widgets kein Problem, allerdings will ich auch externe Programme starten und einbinden. Also die GUI eines anderen Programms wird angezeigt als Seite in einem meiner Notebooks. Wieder recht simple, man erstellt ein Gtk.Socket, hängt dieses als Seite ins Notebook, startet dann das externe Programm und übergibt dem dabei die ID des Sockets.
Problematisch wirds wenn dann eine Seite die solch ein Socket beinhaltet verschoben, also von einem Notebook in ein anderes gezogen, wird. Dort funktioniert dann die Anzeige nicht mehr, sie bleibt weiß und zeigt nicht mehr das externe Programm.
Mir scheint als würde durch das Bewegen ein neues Socket erstellt werden. Wenn ich auf die Events "page-added" und "page-removed" höre und dort die ID ausgeben lasse, bekomme ich bei den beiden eine unterschiedliche ID (Immer 0x0 bei page-removed und z.B. 0x5e000de bei page-added). Wenn ich die Seite nochmal verschiebe, bekomme ich wieder eine neue ID. Dazu kommt dass diese ID noch unterschiedlich von der ist, die ich dem subprocess übergebe. Ich kann mir vorstellen dass die ID 0, die ich bei page-removed bekomme, quasi eine invalide ID ist, damit man sie nicht mehr verwenden kann. Aber die bei page-added sollte doch jedes mal die selbe sein wie gleich nach dem erstellen des Sockets, oder? Wieso wird hier ein neues Socket erstellt?

MWE:

Code: Alles auswählen

import subprocess
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

def handleAdd(notebook, child, pageNum):
    print("Handle add")
    if isinstance(child, Gtk.Socket):
        print("ID: " + hex(child.get_id()))

def handleRemove(notebook, child, pageNum):
    print("Handle remove")
    if isinstance(child, Gtk.Socket):
        print("ID: " + hex(child.get_id()))

window = Gtk.Window()

paned = Gtk.HPaned()

notebookLeft = Gtk.Notebook()
notebookRight = Gtk.Notebook()
notebookLeft.connect("page-added", handleAdd)
notebookLeft.connect("page-removed", handleRemove)
notebookRight.connect("page-added", handleAdd)
notebookRight.connect("page-removed", handleRemove)

textviewLeft = Gtk.TextView()
textviewRight = Gtk.TextView()

notebookLeft.append_page(textviewLeft)
notebookLeft.set_tab_detachable(textviewLeft, True)
notebookLeft.set_tab_reorderable(textviewLeft, True)
notebookLeft.set_group_name("Main")
notebookRight.append_page(textviewRight)
notebookRight.set_tab_detachable(textviewRight, True)
notebookRight.set_tab_reorderable(textviewRight, True)
notebookRight.set_group_name("Main")

socket = Gtk.Socket()
notebookRight.append_page(socket)
notebookRight.set_tab_detachable(socket, True)
notebookRight.set_tab_reorderable(socket, True)

paned.add1(notebookLeft)
paned.add2(notebookRight)
window.add(paned)

window.connect("delete-event", Gtk.main_quit)

window.show_all()

print("main socket id " + hex(socket.get_id()))
process = subprocess.Popen(["gtkwave", "/home/benedikt/repos/synpathic/synpathic/testsrc/tb_blake2b.ghw", "-X", hex(socket.get_id())])

Gtk.main()
LG
Ben
bent93
User
Beiträge: 2
Registriert: Mittwoch 24. Juli 2019, 09:38

Ah ja nochwas, es wird folgender Fehler ausgegeben:
(test.py:14280): Gtk-CRITICAL **: 11:29:06.642: gtk_socket_get_id: assertion '_gtk_widget_get_anchored (GTK_WIDGET (socket))' failed
Ich glaube das passiert aber nur weil das erste handleAdd gemacht wird, bevor das Socket in einem Main-Window hängt.
Antworten