GTK Splashscreen als Thread

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
jgillich
User
Beiträge: 16
Registriert: Donnerstag 15. September 2011, 16:20

Ich versuche gerade, einen Splashscreen während der Ladezeit meines Programms (die ist recht lang) anzeigen zu lassen. Etwas anderes als per Thread fällt mir nicht ein, wenn das irgendwie ohne geht würde ich das vorziehen. Hier jedenfalls mein Code:

Code: Alles auswählen

#!/usr/bin/python2
# -*- coding: utf8 -*

import gtk
import threading

class Splash(threading.Thread):
    def __init__(self):
        gtk.gdk.threads_init()
        threading.Thread.__init__(self)


    def run(self):
        builder = gtk.Builder()
        builder.add_from_file("ui/splash.glade")
        wsplash = builder.get_object("wsplash")
        wsplash.show()
        gtk.gdk.threads_enter();
        gtk.main()
        gtk.gdk.threads_leave ();

    def hide_splash(*args):
        gtk.main_quit()
Erzeugt folgenden Fehler:

Code: Alles auswählen

[xcb] Unknown request in queue while dequeuing
[xcb] Most likely this is a multi-threaded client and XInitThreads has not been called
[xcb] Aborting, sorry about that.
python2: xcb_io.c:178: dequeue_pending_request: Assertion `!xcb_xlib_unknown_req_in_deq' failed.
Aufruf durch:

Code: Alles auswählen

splash = Splash()
splash.start()
Das komische an dem ganzen ist, dass es manchmal aber auch funktioniert und obige meldung nicht kommt. Wenn es jedoch funktioniert ist es so, dass durch den aufruf von hide_splash, also gtk.main_quit() der Splash trotzdem weiterhin angezeigt wird. Kurz danach wird die normale GTK-Oberfläche ohne Thread geladen, vielleicht liegt es auch daran.

Kann mir da jemand weiterhelfen?
BlackJack

@jgillich: Bei den meisten GUI-Toolkits darf die GUI-Hauptschleife nur im Hauptthread aufgerufen werden.
Antworten