# HG changeset patch # User Edouard Tisserant # Date 1518802710 -3600 # Node ID cde74a39df51a3d900a25d2a69beb92245686655 # Parent 8dc4ebc9777721b4d6a98422a42658e8f9fa9cc3 Fixed Exception dialog disapearing after a view second when exception occurs during app startup. Problem was caused by splashscreen timeout, wx closing averything else if there is no more main frame. Changes: - no more timeout for splashscreen - use wx.App OnInit method to give first operation to mainloop, object are then now created in mainloop - main loop is then created _before_ showing splash screen - no more wxyield or wx processevent tricks needed to display splash screen - exception handler not blocking anymore on dialog (callafter) - because of mainloop being there before everything, exit must be called explicitely if exception caught during startup -> exit parameter in handle_exception + try/except around startup calls UNTESTED ON WINDOWS diff -r 8dc4ebc97777 -r cde74a39df51 Beremiz.py --- a/Beremiz.py Fri Feb 16 18:24:55 2018 +0100 +++ b/Beremiz.py Fri Feb 16 18:38:30 2018 +0100 @@ -31,11 +31,10 @@ import time import wx -from wx.lib.agw.advancedsplash import AdvancedSplash +from wx.lib.agw.advancedsplash import AdvancedSplash, AS_NOTIMEOUT, AS_CENTER_ON_SCREEN import util.paths as paths - class BeremizIDELauncher(object): def __init__(self): self.app = None @@ -55,17 +54,8 @@ def ShowSplashScreen(self): bmp = wx.Image(self.splashPath).ConvertToBitmap() - self.splash = AdvancedSplash(None, bitmap=bmp) - - # process all events - # even the events generated by splash themself during showing - if wx.Platform == '__WXMSW__': - self.splash.Show() - self.splash.ProcessEvent(wx.PaintEvent()) - else: - for dummy in range(0, 30): - wx.Yield() - time.sleep(0.01) + self.splash = AdvancedSplash(None, bitmap=bmp, agwStyle=AS_NOTIMEOUT | AS_CENTER_ON_SCREEN) + def Usage(self): print("Usage:") @@ -115,11 +105,15 @@ self.buildpath = args[1] def CreateApplication(self): - if wx.VERSION >= (3, 0, 0): - self.app = wx.App(redirect=self.debug) - else: - self.app = wx.PySimpleApp(redirect=self.debug) - + + BeremizAppType = wx.App if wx.VERSION >= (3, 0, 0) else wx.PySimpleApp + class BeremizApp(BeremizAppType): + def OnInit(_self): + self.ShowSplashScreen() + wx.CallAfter(self.AppStart) + return True + + self.app = BeremizApp(redirect=self.debug) self.app.SetAppName('beremiz') if wx.VERSION < (3, 0, 0): wx.InitAllImageHandlers() @@ -129,7 +123,6 @@ self.CheckUpdates() self.LoadExtensions() self.ImportModules() - self.InstallExceptionHandler() def InitI18n(self): from util.misc import InstallLocalRessources @@ -178,7 +171,7 @@ def InstallExceptionHandler(self): import version import util.ExceptionHandler - util.ExceptionHandler.AddExceptHook(version.app_version) + self.handle_exception = util.ExceptionHandler.AddExceptHook(version.app_version) def CreateUI(self): self.frame = self.BeremizIDE.Beremiz(None, self.projectOpen, self.buildpath) @@ -193,17 +186,24 @@ def PreStart(self): self.ProcessCommandLineArgs() self.CreateApplication() - self.ShowSplashScreen() - self.BackgroundInitialization() - self.CreateUI() - self.CloseSplash() + + def AppStart(self): + try: + self.BackgroundInitialization() + self.CreateUI() + self.CloseSplash() + self.ShowUI() + # except (KeyboardInterrupt, SystemExit): + # raise + except Exception: + self.handle_exception(*sys.exc_info(), exit = True) def MainLoop(self): self.app.MainLoop() def Start(self): self.PreStart() - self.ShowUI() + self.InstallExceptionHandler() self.MainLoop() diff -r 8dc4ebc97777 -r cde74a39df51 connectors/WAMP/__init__.py --- a/connectors/WAMP/__init__.py Fri Feb 16 18:24:55 2018 +0100 +++ b/connectors/WAMP/__init__.py Fri Feb 16 18:38:30 2018 +0100 @@ -27,7 +27,6 @@ from __future__ import print_function import sys import traceback -import atexit from threading import Thread, Event from twisted.internet import reactor, threads diff -r 8dc4ebc97777 -r cde74a39df51 util/ExceptionHandler.py --- a/util/ExceptionHandler.py Fri Feb 16 18:24:55 2018 +0100 +++ b/util/ExceptionHandler.py Fri Feb 16 18:38:30 2018 +0100 @@ -37,7 +37,7 @@ Max_Traceback_List_Size = 20 -def Display_Exception_Dialog(e_type, e_value, e_tb, bug_report_path): +def Display_Exception_Dialog(e_type, e_value, e_tb, bug_report_path, exit): trcbck_lst = [] for i, line in enumerate(traceback.extract_tb(e_tb)): trcbck = " " + str(i+1) + ". " @@ -74,6 +74,8 @@ finally: dlg.Destroy() + if exit : sys.exit() #wx.Exit() + return res @@ -125,7 +127,7 @@ output.write(a + ":\n" + str(info[a]) + "\n\n") output.close() - def handle_exception(e_type, e_value, e_traceback): + def handle_exception(e_type, e_value, e_traceback, exit = False): traceback.print_exception(e_type, e_value, e_traceback) # this is very helpful when there's an exception in the rest of this func last_tb = get_last_traceback(e_traceback) ex = (last_tb.tb_frame.f_code.co_filename, last_tb.tb_frame.f_lineno) @@ -135,7 +137,7 @@ path = tempfile.gettempdir()+os.sep+wx.GetApp().GetAppName() bug_report_path = path + os.sep + "bug_report_" + time.strftime("%Y_%m_%d__%H-%M-%S") + ".txt" save_bug_report(e_type, e_value, e_traceback, bug_report_path, date) - Display_Exception_Dialog(e_type, e_value, e_traceback, bug_report_path) + wx.CallAfter(Display_Exception_Dialog, e_type, e_value, e_traceback, bug_report_path, exit) # sys.excepthook = lambda *args: wx.CallAfter(handle_exception, *args) sys.excepthook = handle_exception @@ -154,3 +156,5 @@ sys.excepthook(*sys.exc_info()) self.run = run_with_except_hook threading.Thread.__init__ = init + + return handle_exception