Skip to content

RichLog

A RichLog is a widget which displays scrollable content that may be appended to in realtime.

Call RichLog.write with a string or Rich Renderable to write content to the end of the RichLog. Call RichLog.clear to clear the content.

Tip

See also Log which is an alternative to RichLog but specialized for simple text.

  • Focusable
  • Container

Example

The example below shows an application showing a RichLog with different kinds of data logged.

RichLogApp │   │   previous_value=next(iter_values) │   exceptStopIteration: │   │   return │   first=True▅▅ │   forvalueiniter_values: │   │   yieldfirst,False,previous_value │   │   first=False │   │   previous_value=value │   yieldfirst,True,previous_value ┏━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━┳━━━━━━━┓ laneswimmer             country      time  ┡━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━╇━━━━━━━┩ 4   Joseph Schooling    Singapore    50.39 2   Michael Phelps      United States51.14 5   Chad le Clos        South Africa 51.14 6   László Cseh         Hungary      51.14 3   Li Zhuhao           China        51.26 8   Mehdy Metella       France       51.58 7   Tom Shields         United States51.73 1   Aleksandr SadovnikovRussia       51.84 └──────┴──────────────────────┴───────────────┴───────┘ Write text or any Rich renderable! Key(key='H'character='H'name='upper_h'is_printable=True) Key(key='i'character='i'name='i'is_printable=True)

import csv
import io

from rich.syntax import Syntax
from rich.table import Table

from textual import events
from textual.app import App, ComposeResult
from textual.widgets import RichLog

CSV = """lane,swimmer,country,time
4,Joseph Schooling,Singapore,50.39
2,Michael Phelps,United States,51.14
5,Chad le Clos,South Africa,51.14
6,László Cseh,Hungary,51.14
3,Li Zhuhao,China,51.26
8,Mehdy Metella,France,51.58
7,Tom Shields,United States,51.73
1,Aleksandr Sadovnikov,Russia,51.84"""


CODE = '''\
def loop_first_last(values: Iterable[T]) -> Iterable[tuple[bool, bool, T]]:
    """Iterate and generate a tuple with a flag for first and last value."""
    iter_values = iter(values)
    try:
        previous_value = next(iter_values)
    except StopIteration:
        return
    first = True
    for value in iter_values:
        yield first, False, previous_value
        first = False
        previous_value = value
    yield first, True, previous_value\
'''


class RichLogApp(App):
    def compose(self) -> ComposeResult:
        yield RichLog(highlight=True, markup=True)

    def on_ready(self) -> None:
        """Called  when the DOM is ready."""
        text_log = self.query_one(RichLog)

        text_log.write(Syntax(CODE, "python", indent_guides=True))

        rows = iter(csv.reader(io.StringIO(CSV)))
        table = Table(*next(rows))
        for row in rows:
            table.add_row(*row)

        text_log.write(table)
        text_log.write("[bold magenta]Write text or any Rich renderable!")

    def on_key(self, event: events.Key) -> None:
        """Write Key events to log."""
        text_log = self.query_one(RichLog)
        text_log.write(event)


if __name__ == "__main__":
    app = RichLogApp()
    app.run()

Reactive Attributes

Name Type Default Description
highlight bool False Automatically highlight content.
markup bool False Apply Rich console markup.
max_lines int None Maximum number of lines in the log or None for no maximum.
min_width int 78 Minimum width of renderables.
wrap bool False Enable word wrapping.

Messages

This widget sends no messages.

Bindings

This widget has no bindings.

Component Classes

This widget has no component classes.


textual.widgets.RichLog class

def __init__(
    self,
    *,
    max_lines=None,
    min_width=78,
    wrap=False,
    highlight=False,
    markup=False,
    auto_scroll=True,
    name=None,
    id=None,
    classes=None,
    disabled=False
):

Bases: ScrollView

A widget for logging text.

Parameters
Name Type Description Default
max_lines int | None

Maximum number of lines in the log or None for no maximum.

None
min_width int

Minimum width of renderables.

78
wrap bool

Enable word wrapping (default is off).

False
highlight bool

Automatically highlight content.

False
markup bool

Apply Rich console markup.

False
auto_scroll bool

Enable automatic scrolling to end.

True
name str | None

The name of the text log.

None
id str | None

The ID of the text log in the DOM.

None
classes str | None

The CSS classes of the text log.

None
disabled bool

Whether the text log is disabled or not.

False

auto_scroll class-attribute instance-attribute

auto_scroll: var[bool] = auto_scroll

Automatically scroll to the end on write.

highlight class-attribute instance-attribute

highlight: var[bool] = highlight

Automatically highlight content.

markup class-attribute instance-attribute

markup: var[bool] = markup

Apply Rich console markup.

max_lines class-attribute instance-attribute

max_lines: var[int | None] = max_lines

Maximum number of lines in the log or None for no maximum.

min_width class-attribute instance-attribute

min_width: var[int] = min_width

Minimum width of renderables.

wrap class-attribute instance-attribute

wrap: var[bool] = wrap

Enable word wrapping.

clear method

def clear(self):

Clear the text log.

Returns
Type Description
Self

The RichLog instance.

write method

def write(
    self,
    content,
    width=None,
    expand=False,
    shrink=True,
    scroll_end=None,
):

Write text or a rich renderable.

Parameters
Name Type Description Default
content RenderableType | object

Rich renderable (or text).

required
width int | None

Width to render or None to use optimal width.

None
expand bool

Enable expand to widget width, or False to use width.

False
shrink bool

Enable shrinking of content to fit width.

True
scroll_end bool | None

Enable automatic scroll to end, or None to use self.auto_scroll.

None
Returns
Type Description
Self

The RichLog instance.