diff --git a/src/textual/widgets/_tabbed_content.py b/src/textual/widgets/_tabbed_content.py index 8da6e3646..e942a785c 100644 --- a/src/textual/widgets/_tabbed_content.py +++ b/src/textual/widgets/_tabbed_content.py @@ -202,3 +202,4 @@ class TabbedContent(Widget): """Switch tabs when the active attributes changes.""" with self.prevent(Tabs.TabActivated): self.get_child_by_type(Tabs).active = active + self.get_child_by_type(ContentSwitcher).current = active diff --git a/tests/test_tabbed_content.py b/tests/test_tabbed_content.py index 23af3151c..8efb4cfdf 100644 --- a/tests/test_tabbed_content.py +++ b/tests/test_tabbed_content.py @@ -4,8 +4,8 @@ from textual.app import App, ComposeResult from textual.widgets import Label, TabbedContent, TabPane -async def test_tabbed_content_switch(): - """Check tab navigation.""" +async def test_tabbed_content_switch_via_ui(): + """Check tab navigation via the user interface.""" class TabbedApp(App): def compose(self) -> ComposeResult: @@ -54,6 +54,44 @@ async def test_tabbed_content_switch(): assert not app.query_one("#bar-label").region assert app.query_one("#baz-label").region + +async def test_tabbed_content_switch_via_code(): + """Check tab navigation via code.""" + + class TabbedApp(App): + def compose(self) -> ComposeResult: + with TabbedContent(): + with TabPane("foo", id="foo"): + yield Label("Foo", id="foo-label") + with TabPane("bar", id="bar"): + yield Label("Bar", id="bar-label") + with TabPane("baz", id="baz"): + yield Label("Baz", id="baz-label") + + app = TabbedApp() + async with app.run_test() as pilot: + tabbed_content = app.query_one(TabbedContent) + + # Check first tab + assert tabbed_content.active == "foo" + assert app.query_one("#foo-label").region + assert not app.query_one("#bar-label").region + assert not app.query_one("#baz-label").region + + # Click second tab + tabbed_content.active = "bar" + await pilot.pause() + assert not app.query_one("#foo-label").region + assert app.query_one("#bar-label").region + assert not app.query_one("#baz-label").region + + # Click third tab + tabbed_content.active = "baz" + await pilot.pause() + assert not app.query_one("#foo-label").region + assert not app.query_one("#bar-label").region + assert app.query_one("#baz-label").region + # Check fail with non existent tab with pytest.raises(ValueError): tabbed_content.active = "X"