これは非常に古い質問であることは知っていますが、Gtk+3 でも同じ問題があり、Gtk.events_pending() を使用しても効果がなかったため、別のルートを取りました。
基本的には、スプラッシュ スクリーンを手動でクリアするためのボタンを配置するだけです。これは、多くの商用アプリで見られます。次に、スプラッシュ スクリーンを前面に保持するメイン ウィンドウを作成した後、スプラッシュ スクリーンで window.present() を呼び出します。これは、Gtk+3 が実際にスプラッシュ スクリーンのコンテンツを表示してからメイン ウィンドウを表示する前に必要な一時停止のようです。
class splashScreen():
def __init__(self):
#I happen to be using Glade
self.gladefile = "VideoDatabase.glade"
self.builder = Gtk.Builder()
self.builder.add_from_file(self.gladefile)
self.builder.connect_signals(self)
self.window = self.builder.get_object("splashscreen")
#I give my splashscreen an "OK" button
#This is not an uncommon UI approach
self.button = self.builder.get_object("button")
#Button cannot be clicked at first
self.button.set_sensitive(False)
#Clicking the button will destroy the window
self.button.connect("clicked", self.clear)
self.window.show_all()
#Also tried putting this here to no avail
while Gtk.events_pending():
Gtk.main_iteration()
def clear(self, widget):
self.window.destroy()
class mainWindow():
def __init__(self, splash):
self.splash = splash
#Tons of slow initialization steps
#That take several seconds
#Finally, make the splashscreen OK button clickable
#You could probably call splash.window.destroy() here too
self.splash.button.set_sensitive(True)
if __name__ == "__main__":
splScr = splashScreen()
#Leaving this here, has no noticeable effect
while Gtk.events_pending():
Gtk.main_iteration()
#I pass the splashscreen as an argument to my main window
main = mainWindow(splScr)
#And make the splashscreen present to make sure it is in front
#otherwise it gets hidden
splScr.window.present()
Gtk.main()