| 436 | |
| 437 | @contextlib.contextmanager |
| 438 | def run_app_in_thread(self, target=None, args=None): |
| 439 | if target is None: |
| 440 | target = self.app.run |
| 441 | if args is None: |
| 442 | args = (self._pre_run,) |
| 443 | |
| 444 | run_context = AppRunContext() |
| 445 | thread = threading.Thread( |
| 446 | target=self._do_run_app, args=(target, args, run_context) |
| 447 | ) |
| 448 | try: |
| 449 | thread.start() |
| 450 | self._wait_until_app_is_done_updating() |
| 451 | yield run_context |
| 452 | finally: |
| 453 | if self._app_is_exitable(): |
| 454 | self.app.exit() |
| 455 | thread.join() |
| 456 | |
| 457 | def feed_input(self, *keys): |
| 458 | for key in keys: |