2016-05-03 11 views
1

Ich habe eine Funktion in meiner Haupt-Anwendung, die wie folgt aussieht:GTK + 3 + Python: "Loading ..." Dialog

def foo(stuff): 

    a_line_that_takes_a_while(stuff) 

    return result 

Ich versuche, einen Dialog hinzufügen, bevor a_line_that_takes_a_while zu zeigen und zerstören es direkt nach dieser Zeile ausgeführt wurde.

Ich habe versucht:

def foo(stuff): 
    dialog = Gtk.MessageDialog(...) 
    dialog.show_all() 

    a_line_that_takes_a_while(stuff) 

    dialog.destroy() 

    return result 

Aber überraschend, der Dialog nur angezeigt, wenn a_line_that_takes_a_while bereits ausgeführt wurde. Natürlich kann ich dialog.run() nicht verwenden, da dies die Hauptschleife der Anwendung blockieren würde.

Irgendwelche Ideen?

+0

Ich antwortete kürzlich auf eine C-Version dieser gleichen Frage hier: http://StackOverflow.com/Questions/36971139/Gui-Becomes-unresponsive-after-Clicking-the-Button-using-GTK-in-C – ebassi

Antwort

3

Alles, was Ihre Aufrufe an GTK wirklich tun, ist das Einreihen von Aktionen, die während der Hauptschleife auftreten. Ein Dialog ist ein besonderer Fall, wenn Sie dialog.run() aufrufen, um bestimmte Updates zu erlauben. Ihre foo-Funktion weist GTK an, einen Dialog zu erstellen und ihn dann zu zerstören, bevor er überhaupt damit begonnen hat, die Arbeit zu erledigen.

Threads sollte die Aufgabe erledigen. Das größte Problem ist, dass GTK NICHT Thread-sicher ist. Seien Sie daher vorsichtig, wenn Sie sich für die Verwendung von nativem Python-Threading entscheiden. Wenn Sie Plattenoperationen durchführen, sollten Sie die asynchronen Callbacks von GFile berücksichtigen. Sie könnten Sie ein wenig Rad neu erfinden retten.