MessageDialog wird nicht angezeigt (Linux)

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

habe irgendwie ein unreproduzierbares und mir unerklärliches Problem.
Gleich vorneweg es ist daher sehr kompliziert das Skript zu testen und mit einem Zeitaufwand verbunden.

Ich bin dabei ein Programm zu schreiben, welches einem beim Remastern von Knoppix helfen soll.
Dafür muss ich eine ganze Menge an externen Programmen ausführen und habe daher für diese Ausführungen einen 2. Prozess gewählt.
Dieser sendet die Daten über eine Pipe, die von gobject.io_add_watch abgehört wird, an das GUI.
Passiert nun ein Fehler macht das Programm alles rückgängig und soll danach noch eine Fehlermeldung anzeigen.
Dazu sendet es einen Tuple ('error', fehlermeldung) an den GUI-Prozess, was auch funktioniert, genau wie der Rest des GUIs (z.B. Statusupdates).
Doch der dann erzeugte MessageDialog wird einfach nicht angezeigt.
Ich führe run() aus, die Funktion bleibt stehen aber der Dialog geht nicht auf.
Folgender Code, der im Grunde das gleiche macht funktioniert jedoch:

Code: Alles auswählen

import time
import multiprocessing

import gtk
import gobject

def test(pipe):
    pipe.send('hallo')
    time.sleep(10)
    pipe.send('welt')

def update(fd, condition):
    dialog = gtk.MessageDialog(type=gtk.MESSAGE_ERROR, buttons=gtk.BUTTONS_OK, message_format=fd.recv())
    dialog.run()
    dialog.destroy()
    return True
    
pipe_parent, pipe_child = multiprocessing.Pipe()
process = multiprocessing.Process(target = test,
                                       args = (pipe_child,))
gobject.io_add_watch(pipe_parent, gobject.IO_IN | gobject.IO_PRI, update)
process.start()
gtk.main()
Ich bin einfach am Ende mit meinem Latein.

Da ich das Problem nicht mit einem kürzeren und einfacherem Code reproduzieren kann hier der gesamte Code:
https://github.com/koehlma/remasterscri ... nxremaster
In dem GIT-Repo ist auch noch die erste Version des Skriptes drin, aber man kann die __init__.py von knxremaster als eigenständiges Programm aufrufen.
Dazu braucht man allerdings noch eine Reihe an externen Programmen, was sich dann eher kompliziert gestaltet.
Der Fehler ist in dieser Datei in Zeile 47 bis 52.
Vielleicht will sich ja jemand die Mühe machen und sich das mal angucken.
Installieren kann man das ganze wie folgt:
Von hier die Dateien create_compressed_fs.static und extract_compressed_fs.static herunterladen und nach '/opt/remasterscript/bin/' kopieren und dabei das .static aus dem Dateinamen entfernen.
Dann braucht man eigentlich nur noch PyGTK und PyGObject und ein ISO von Knoppix.
Das ISO-Image kann man dann mit

Code: Alles auswählen

sudo mount -t iso9660 -o ro <ISO-Dateiame> <Zielverzeichnis>
mounten.
Nach einem Start des Skriptes als root drückt man auf "Remaster Erstellen" wählt als Quelle das Verzeichnis des gemounteten ISOs.
Als Ziel ein beliebiges leeres Verzeichnis.
Dann drückt man auf "Erstellen".
Um nun einen Fehler zu produzieren schießt man den Prozess /opt/remasterscript/bin/extract_compressed_fs ab.
Dieser entsteht, wenn der Fortschrittsbalken "Dekomprimiere Image" anzeigt.
Nun löscht das Skript die erstellten Dateien und gibt auf der Konsole die Instanz des Dialoges aus, der nicht angezeigt wird.

Ich weiß, dass das alles ein bisschen sehr kompliziert und zeitaufwendig ist.
Lieber würde ich eine kleinere und einfachere Version präsentieren, aber das Problem bekomme ich einfach nicht isoliert.

/* Edit:
Eines habe ich vergessen:
Wenn ihr meint, dass das ganze Konzept schlecht ist, dann freue ich mich auch gerne, ungeachtet des eigentlichen Problemes, auf Verbesserungs-Vorschläge.
*/

Vielen Dank fürs Lesen und Viele Grüße
Maxi
Zuletzt geändert von maxi_king_333 am Sonntag 13. März 2011, 16:08, insgesamt 1-mal geändert.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Also jetzt bin ich völlig verwirrt... :K
Wenn ich in dem betroffenen Bereich ein normales Fenster erstelle und es anzeige, dann wird sowohl das Fenster als auch der Dialog angezeigt.
Hat dazu jemand eine Erklärung?
Woran könnte soetwas liegen?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Vielleicht ist der Dialog offen, aber unsichtbar? Möglicherweise versteckt er sich ja hinter anderen Fenstern oder dein Windowmanager zeichnet ihn außerhalb des sichtbaren Bereichs.

Wenn ich mich richtig entsinne gilt für Dialoge eine andere Policy was die Z-Position angeht als für Fenster. D.h. Fenster werden (natürlich auch abhängig vom Windowmanager) immer im Vordergrund geöffnet und Dialoge vielleicht nicht.
maxi_king_333
User
Beiträge: 110
Registriert: Freitag 25. Dezember 2009, 03:42

Hi,

danke für die Antwort.
Vielleicht ist der Dialog offen, aber unsichtbar? Möglicherweise versteckt er sich ja hinter anderen Fenstern oder dein Windowmanager zeichnet ihn außerhalb des sichtbaren Bereichs.

Wenn ich mich richtig entsinne gilt für Dialoge eine andere Policy was die Z-Position angeht als für Fenster. D.h. Fenster werden (natürlich auch abhängig vom Windowmanager) immer im Vordergrund geöffnet und Dialoge vielleicht nicht.
Ich glaube, da hast Du recht, die Idee kam mir nicht, da zumindest bisher die Dialog-Boxen immer im Vordergrund aufgingen, aber bisher gab es auch immer ein entsprechendes Fenster.
Habe nun einfach das Fenster, was ich vorher versteckt hatte und was den Fortschritt anzeigt, als parent genommen und schon wird der Dialog angezeigt.
Als Status dann halt einfach Fehler und die ProgressBar auf 0%.

Danke für den Tipp.

Viele Grüße
Maxi
Antworten