From 5586b24198b268b0e1253a987390a11083990212 Mon Sep 17 00:00:00 2001 From: zebra-lucky Date: Fri, 31 Oct 2025 08:43:26 +0200 Subject: [PATCH] Qt: fix QtAsyncio.run args, handle SystemExit --- scripts/joinmarket-qt.py | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/scripts/joinmarket-qt.py b/scripts/joinmarket-qt.py index 6669c40..2993c66 100755 --- a/scripts/joinmarket-qt.py +++ b/scripts/joinmarket-qt.py @@ -56,7 +56,7 @@ JM_GUI_VERSION = '33' from jmbase import get_log, stop_reactor, set_custom_stop_reactor, bintohex from jmbase.support import EXIT_FAILURE, utxo_to_utxostr,\ - hextobin, JM_CORE_VERSION + hextobin, JM_CORE_VERSION, twisted_sys_exit import jmbitcoin as btc from jmclient import load_program_config, get_network, update_persist_config,\ open_test_wallet_maybe, get_wallet_path,\ @@ -2548,7 +2548,7 @@ async def refuse_if_non_segwit_wallet(): "of the field `segwit` in the `POLICY` section."]) await JMQtMessageBox(None, wallet_load_error, mbtype='crit', title='Incompatible wallet type') - sys.exit(EXIT_FAILURE) + twisted_sys_exit(EXIT_FAILURE) async def onTabChange(i, tabWidget): @@ -2561,9 +2561,22 @@ async def onTabChange(i, tabWidget): await tabWidget.widget(2).updateUtxos() +def qt_exception_handler(context): + exc = context['exception'] + if isinstance(exc, SystemExit): + raise exc + if context["message"]: + print(f"{context['message']} from task {context['task']._name}," + "read the following traceback:") + print(context["traceback"]) + + async def main(): global logsdir, tumble_log, mainWindow + loop = asyncio.get_event_loop() + loop.set_exception_handler(qt_exception_handler) + parser = OptionParser(usage='usage: %prog [options]') add_base_options(parser) # wallet related base options are not applicable: @@ -2585,7 +2598,7 @@ async def main(): ]) await JMQtMessageBox(None, config_load_error, mbtype='crit', title='failed to load') - sys.exit(EXIT_FAILURE) + twisted_sys_exit(EXIT_FAILURE) # Only partial functionality (see wallet info, change config) is possible # without a blockchain interface. if jm_single().bc_interface is None: @@ -2655,7 +2668,7 @@ async def main(): set_custom_stop_reactor(qt_shutdown) # Upon launching the app, ask the user to choose a wallet to open - # await mainWindow.openWallet() + await mainWindow.openWallet() logsdir = None @@ -2666,10 +2679,8 @@ appWindowTitle = 'JoinMarketQt' from twisted.internet import reactor mainWindow = JMMainWindow(reactor) -#mainWindow.show() reactor.runReturn() import PySide6.QtAsyncio as QtAsyncio -exit_status = QtAsyncio.run( - coro=main(), keep_running=True, handle_sigint=True, debug=False) -sys.exit(exit_status) +QtAsyncio.run(coro=main(), keep_running=True, quit_qapp=False, + handle_sigint=False, debug=True)