6

Obecnie mam ekran powitalny na miejscu. Jednak nie działa jako prawdziwy ekran powitalny - ponieważ zatrzymuje wykonywanie reszty kodu (zamiast zezwalać na działanie w tle).Jak dostosować mój bieżący ekran powitalny, aby umożliwić uruchamianie innych elementów kodu w tle?

To jest aktualna (zmniejszona) arytmetka mojego programu, z ważnymi bitami wyświetlanymi w całości. Jak mogę zaadaptować ekran powitalny, który aktualnie działa, aby reszta programu ładowała się w tle? Czy to możliwe w pythonie?

Dzięki!

import ... 
(many other imports) 
def ... 
def ... 
(many other definitions) 

class VFrams(wxFrame): 
    wx.Frame.__init__(self, parent, -1, _("Software"), 
         size=(1024, 768), style=wx.DEFAULT_FRAME_STYLE) 
    (a lot of code goes in here) 

class MySplashScreen(wx.SplashScreen): 
    def __init__(self, parent=None): 
     aBitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap() 
     splashStyle = wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT 
     splashDuration = 5000 # ms 
     wx.SplashScreen.__init__(self, aBitmap, splashStyle, splashDuration, parent) 
     self.Bind(wx.EVT_CLOSE, self.CloseSplash) 
     wx.Yield() 
    def CloseSplash(self, evt): 
     self.Hide() 
     global frame 
     frame = VFrame(parent=None) 
     app.SetTopWindow(frame) 
     frame.Show(True) 
     evt.Skip() 

class MyApp(wx.App): 
    def OnInit(self): 
     MySplash = MySplashScreen() 
     MySplash.Show() 
     return True 

if __name__ == '__main__': 
    DEBUG = viz.addText('DEBUG:', viz.SCREEN) 
    DEBUG.setPosition(0, 0) 
    DEBUG.fontSize(16) 
    DEBUG.color(viz.BLACK) 
    Start_Mainvars()   
    Start_Config() 
    Start_Translation() 
    Start_DB() 
    Start_Themes() 
    Start_Gui() 
    Start_Get_Isos() 
    Start_Bars() 
    Start_Menus() 
    Start_Event_Handlers() 
    app = MyApp() 
    app.MainLoop() 

Dziękuję za wszelką pomoc, to jak zmieniłem kod (poniższy dostarczonego radę):

def show_splash(): 
    # create, show and return the splash screen 
    global splash 
    bitmap = wx.Image(name=VarFiles["img_splash"]).ConvertToBitmap() 
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1) 
    splash.Show() 
    return splash 

class MyApp(wx.App): 
    def OnInit(self): 
     global frame, splash 
     splash = show_splash() 
     Start_Config() 
     Start_Translation() 
     Start_DB() 
     Start_Themes() 
     Start_Gui() 
     Start_Get_Isos() 
     Start_Bars("GDP1POP1_20091224_gdp", "1 pork") 
     Start_Menus() 
     Start_Event_Handlers() 
     frame = VFrame(parent=None) 
     frame.Show(True) 
     splash.Destroy() 
     return True 

if __name__ == '__main__': 
    DEBUG = viz.addText('DEBUG:', viz.SCREEN) 
    DEBUG.setPosition(0, 0) 
    DEBUG.fontSize(16) 
    DEBUG.color(viz.BLACK) 
    Start_Mainvars() 
    app = MyApp() 
    app.MainLoop() 

Odpowiedz

12

Twój kod jest dość brudny/skomplikowany. Nie ma potrzeby nadpisywania polecenia wx.SplashScreen i nie ma powodu, dla którego zdarzenie zamykania ekranu powitalnego powinno tworzyć główne okno aplikacji. Oto jak robię ekrany powitalne.

import wx 

def show_splash(): 
    # create, show and return the splash screen 
    bitmap = wx.Bitmap('images/splash.png') 
    splash = wx.SplashScreen(bitmap, wx.SPLASH_CENTRE_ON_SCREEN|wx.SPLASH_NO_TIMEOUT, 0, None, -1) 
    splash.Show() 
    return splash 

def main(): 
    app = wx.PySimpleApp() 
    splash = show_splash() 

    # do processing/initialization here and create main window 
    frame = MyFrame(...) 
    frame.Show() 

    splash.Destroy() 
    app.MainLoop() 

if __name__ == '__main__': 
    main() 

Po prostu utwórz ekran powitalny tak szybko, jak to możliwe bez limitu czasu. Kontynuuj ładowanie i utwórz główne okno aplikacji. Następnie zniszcz ekran powitalny, aby zniknął. Pokazywanie ekranu powitalnego nie powstrzymuje innego przetwarzania.

+0

Dziękuję bardzo. Próbuję tego. – relima

0

Będziemy chcieli wykorzystać dwa wątki: jeden dla ekranu powitalnego, jeden dla dowolnego innego kodu, który chcesz wykonać. Oba wątki działałyby w tym samym czasie, zapewniając pożądany rezultat.

+0

Występuje problem: nigdy nie użyłem wątków. Próbowałem go uruchomić, ale nie mam pojęcia, jak go wprowadzić. Spodziewałem się uczyć na podstawie odpowiedzi na to pytanie. – relima

+0

Zobacz niektóre artykuły online na ten temat. Znalazłem ten, który może pomóc: http://www.devshed.com/c/a/Python/Basic-Threading-in-Python – Bernard

+0

Nic nie jest potrzebne tutaj. Ekran powitalny nie blokuje wykonania, jeśli jest używany prawidłowo. – FogleBird