error on self pop

This commit is contained in:
Will McGugan
2024-09-16 14:37:25 +01:00
parent 8e6de4cdf3
commit 9115b7e868
2 changed files with 24 additions and 2 deletions

View File

@@ -2514,13 +2514,18 @@ class App(Generic[ReturnType], DOMNode):
Returns:
The screen that was replaced.
"""
_rich_traceback_omit = True
screen_stack = self._screen_stack
if len(screen_stack) <= 1:
raise ScreenStackError(
"Can't pop screen; there must be at least one screen on the stack"
)
if active_message_pump.get() is self.screen:
raise ScreenError(
f"Can't pop screen {self.screen} from it's own message loop; Consider using the @work decorator."
)
previous_screen = screen_stack.pop()
previous_screen._pop_result_callback()
self.screen.post_message(events.ScreenResume())

View File

@@ -7,7 +7,7 @@ import threading
import pytest
from textual import work
from textual.app import App, ComposeResult, ScreenStackError
from textual.app import App, ComposeResult, ScreenError, ScreenStackError
from textual.events import MouseMove
from textual.geometry import Offset
from textual.screen import Screen
@@ -624,3 +624,20 @@ async def test_worker_cancellation():
# Press enter to activate button to dismiss them
await pilot.press("enter")
await pilot.press("enter")
async def test_self_pop_screen():
"""Regression test for https://github.com/Textualize/textual/issues/5008"""
class MyScreen(Screen):
def on_mount(self):
self.app.pop_screen()
class PopApp(App):
def on_mount(self) -> None:
self.push_screen(MyScreen())
app = PopApp()
with pytest.raises(ScreenError):
async with app.run_test() as pilot:
pass