def __call__(self, *args):
        try:
            if self.subst:
                args = self.subst(*args)
            return self.func(*args)
        except SystemExit as msg:
            raise SystemExit(msg)
        except Exception:
            # this was tkinter's standard coding: self.widget._report_exception()
            exc_type, exc_value, exc_traceback = sys.exc_info()
            msg = ''.join(traceback.format_exception_only(exc_type, exc_value))
            tracebk = ''.join(traceback.format_tb(exc_traceback, limit=7))
            tkinter.messagebox.showerror(_("Exception"), 
                                         _("{0}\nCall trace\n{1}").format(msg, tracebk))
Apply first function SUBST to arguments, than FUNC.
dataset/ETHPy150Open Arelle/Arelle/arelle/CntlrWinMain.py/TkinterCallWrapper.__call__