Close app on last window exit
Use a system triggered SIGINT on app close to tear down the streaming stack and terminate the `trio`/`tractor` runtimes deterministically.tina_free_vwap
							parent
							
								
									c8073ad891
								
							
						
					
					
						commit
						be18c75428
					
				| 
						 | 
				
			
			@ -20,6 +20,8 @@ Trio - Qt integration
 | 
			
		|||
Run ``trio`` in guest mode on top of the Qt event loop.
 | 
			
		||||
All global Qt runtime settings are mostly defined here.
 | 
			
		||||
"""
 | 
			
		||||
import os
 | 
			
		||||
import signal
 | 
			
		||||
from functools import partial
 | 
			
		||||
import traceback
 | 
			
		||||
from typing import Tuple, Callable, Dict, Any
 | 
			
		||||
| 
						 | 
				
			
			@ -74,11 +76,16 @@ class MainWindow(QtGui.QMainWindow):
 | 
			
		|||
        self.setMinimumSize(*self.size)
 | 
			
		||||
        self.setWindowTitle(self.title)
 | 
			
		||||
 | 
			
		||||
    def closeEvent(self, event: 'QCloseEvent') -> None:
 | 
			
		||||
    def closeEvent(
 | 
			
		||||
        self,
 | 
			
		||||
        event: 'QCloseEvent'
 | 
			
		||||
    ) -> None:
 | 
			
		||||
        """Cancel the root actor asap.
 | 
			
		||||
 | 
			
		||||
        """
 | 
			
		||||
        tractor.current_actor().cancel_soon()
 | 
			
		||||
        # raising KBI seems to get intercepted by by Qt so just use the
 | 
			
		||||
        # system.
 | 
			
		||||
        os.kill(os.getpid(), signal.SIGINT)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def run_qtractor(
 | 
			
		||||
| 
						 | 
				
			
			@ -128,10 +135,14 @@ def run_qtractor(
 | 
			
		|||
 | 
			
		||||
    def done_callback(outcome):
 | 
			
		||||
 | 
			
		||||
        print(f"Outcome: {outcome}")
 | 
			
		||||
 | 
			
		||||
        if isinstance(outcome, Error):
 | 
			
		||||
            exc = outcome.error
 | 
			
		||||
 | 
			
		||||
            if isinstance(outcome.error, KeyboardInterrupt):
 | 
			
		||||
                # make it look like ``trio``
 | 
			
		||||
                print("Aborted!")
 | 
			
		||||
 | 
			
		||||
            else:
 | 
			
		||||
                traceback.print_exception(type(exc), exc, exc.__traceback__)
 | 
			
		||||
 | 
			
		||||
        app.quit()
 | 
			
		||||
| 
						 | 
				
			
			@ -144,9 +155,6 @@ def run_qtractor(
 | 
			
		|||
    instance = main_widget()
 | 
			
		||||
    instance.window = window
 | 
			
		||||
 | 
			
		||||
    # kill the app when root actor terminates
 | 
			
		||||
    tractor._actor._lifetime_stack.callback(app.quit)
 | 
			
		||||
 | 
			
		||||
    widgets = {
 | 
			
		||||
        'window': window,
 | 
			
		||||
        'main': instance,
 | 
			
		||||
| 
						 | 
				
			
			@ -170,6 +178,7 @@ def run_qtractor(
 | 
			
		|||
        main,
 | 
			
		||||
        run_sync_soon_threadsafe=run_sync_soon_threadsafe,
 | 
			
		||||
        done_callback=done_callback,
 | 
			
		||||
        # restrict_keyboard_interrupt_to_checkpoints=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    window.main_widget = main_widget
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue