From cb2ab4dc738d0a8692dcdfe5bf16fa563d4b3574 Mon Sep 17 00:00:00 2001 From: Tuna Celik Date: Wed, 9 Oct 2024 19:50:03 +0200 Subject: [PATCH] calling UI updates from a Thread is an illegal operation --- appEditors/appExcEditor.py | 10 +++++++++- appEditors/appGeoEditor.py | 7 ++++++- appEditors/appGerberEditor.py | 7 ++++++- appMain.py | 5 +++-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/appEditors/appExcEditor.py b/appEditors/appExcEditor.py index 71f030c2..34a687b7 100644 --- a/appEditors/appExcEditor.py +++ b/appEditors/appExcEditor.py @@ -4313,9 +4313,13 @@ class AppExcEditor(QtCore.QObject): else: self.edited_obj_name += "_edit" + def deactivate_signal_handler(_): + self.deactivate() + + self.app.connect_custom_signal(deactivate_signal_handler, object) self.app.worker_task.emit({'fcn': self.new_edited_excellon, 'params': [self.edited_obj_name, self.new_tools]}) - self.deactivate() + return self.edited_obj_name @@ -4381,12 +4385,16 @@ class AppExcEditor(QtCore.QObject): filename=None, use_thread=False) except Exception as e: + self.app.custom_signal.emit(None) # calls deactivate_signal_handler() on UI Thread + # make sure that we do not carry the reference of the edited object further along self.edited_obj = None self.app.log.error("Error on Edited object creation: %s" % str(e)) return + self.app.custom_signal.emit(None) # calls deactivate_signal_handler() on UI Thread + # make sure that we do not carry the reference of the edited object further along self.edited_obj = None diff --git a/appEditors/appGeoEditor.py b/appEditors/appGeoEditor.py index b3624ffe..37b626b8 100644 --- a/appEditors/appGeoEditor.py +++ b/appEditors/appGeoEditor.py @@ -1921,6 +1921,11 @@ class AppGeoEditor(QtCore.QObject): :return: None """ + def deactivate_signal_handler(): + self.deactivate() + + self.app.connect_custom_signal(deactivate_signal_handler, object) + def worker_job(editor_obj): # Link shapes into editor. with editor_obj.app.proc_container.new(_("Working...")): @@ -1971,7 +1976,7 @@ class AppGeoEditor(QtCore.QObject): except Exception: pass - self.deactivate() + self.app.custom_signal.emit(None) editor_obj.app.inform.emit(_("Editor Exit. Geometry object was updated ...")) self.app.worker_task.emit({'fcn': worker_job, 'params': [self]}) diff --git a/appEditors/appGerberEditor.py b/appEditors/appGerberEditor.py index c4b0dcfd..3365abd2 100644 --- a/appEditors/appGerberEditor.py +++ b/appEditors/appGerberEditor.py @@ -5405,6 +5405,11 @@ class AppGerberEditor(QtCore.QObject): else: new_grb_name = self.edited_obj_name + "_edit" + def deactivate_grb_editor_signal_handler(): + self.deactivate_grb_editor() + + self.app.connect_custom_signal(deactivate_grb_editor_signal_handler, object) + self.app.worker_task.emit({'fcn': self.new_edited_gerber, 'params': [new_grb_name, self.storage_dict]}) # self.new_edited_gerber(new_grb_name, self.storage_dict) @@ -5533,7 +5538,7 @@ class AppGerberEditor(QtCore.QObject): # make sure to clean the previous results self.results = [] - self.deactivate_grb_editor() + self.app.custom_signal.emit(None) self.app.inform.emit('[success] %s' % _("Done.")) def on_tool_select(self, tool): diff --git a/appMain.py b/appMain.py index 2f0a34cd..22116516 100644 --- a/appMain.py +++ b/appMain.py @@ -1432,7 +1432,7 @@ class App(QtCore.QObject): from_new_path = os.path.dirname(os.path.realpath(__file__)) + '\\appGUI\\VisPyData\\data' shutil.copytree(from_new_path, to_path) - def custom_signal_connect(self, target, params): + def connect_custom_signal(self, target, params): try: self.custom_signal.disconnect() except TypeError: @@ -2707,6 +2707,7 @@ class App(QtCore.QObject): if self.ui.notebook.tabText(idx) == _("Editor"): self.ui.notebook.tabBar.setTabTextColor(idx, self.old_tab_text_color) self.ui.notebook.tabBar.setTabText(idx, _("Properties")) + self.ui.app.on_notebook_tab_changed() # enable the Project Tab if self.ui.notebook.tabText(idx) == _("Project"): @@ -4348,7 +4349,7 @@ class App(QtCore.QObject): def plotcanvas_fit_view(_): self.plotcanvas.fit_view() - self.custom_signal_connect(plotcanvas_fit_view, object) + self.connect_custom_signal(plotcanvas_fit_view, object) def origin_replot(): def worker_task():