Textual is a text-based user interface library (TUI) for the Python programming language. With Textual, you can create beautiful cross-platform TUI applications.
If you would like more information, see An Intro to Textual – Creating Text User Interfaces with Python
In this article, you will learn how to created a tabbed interface in your terminal using Textual. Some other GUI toolkits called tabbed interfaces “pages” or “notebooks”. But in Textual-land, it is called TabbedContent!
The TabbedContent Widget
Let’s take a look at how you can add tabbed content to your terminal GUI / TUI.
Open up your favorite Python editor and create a file named tabbed_demo.py or give it your own memorable name.
Then enter the following code:
# tabbed_demo.py from textual.app import App, ComposeResult from textual.widgets import Button, Markdown, TabbedContent PYTHON = """ # Python - An Amazing Language You should use Python! ## Features - Easy and readable - Can run almost anywhere - Python is fast enough """ C = """ # C++ - When You Want FAST Fast but harder to learn than Python ## Features - Stupid fast - Harder to code - Makes small exes """ RUBY = """ # Ruby - A Web Language Expressive and versatile ## Features - Has a popular web framework - Interpretive """ class TabbedDemo(App): def compose(self) -> ComposeResult: self.close_button = Button("Close", id="close") tabs = ("Python", "C++", "Ruby") with TabbedContent(*tabs): yield Markdown(PYTHON) yield Markdown(C) yield Markdown(RUBY) yield self.close_button def on_mount(self) -> None: self.screen.styles.background = "darkblue" self.close_button.styles.background = "red" def on_button_pressed(self, event: Button.Pressed) -> None: self.exit(event.button.id) if __name__ == "__main__": app = TabbedDemo() app.run()
The first two lines of code are your Textual imports for the various bits you’ll need to create your user interface. Then you create three constants that hold multi-line strings. The multi-line strings contain Markdown, which is a type of markup that is used often on GitHub for documentation purposes.
Textual has a Markdown widget which will transform the multi-line strings into a nicely formatted page of text. To create the “pages” or “tabs” of content, you use TabbedContent as a content manager via Python’s with statement. You pass in the labels for each tab using a tuple.
Note that to get the tabs inserted correctly, you need to use an asterisk when passing in the tuple to TabbedContent.
The rest of the code is pretty self-explanatory if you have read the introductory article linked at the beginning of this tutorial.
When you run this code, you will see something like the following:
Wrapping Up
The TabbedContent widget is a really nice way to add tabbed content to your text-based user interface. Give it a try using some of Textual’s other widgets and see for yourself!