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
Parameter Default Description
max_lines
int | None
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 (default is off).

highlight
bool
False

Automatically highlight content.

markup
bool
False

Apply Rich console markup.

auto_scroll
bool
True

Enable automatic scrolling to end.

name
str | None
None

The name of the text log.

id
str | None
None

The ID of the text log in the DOM.

classes
str | None
None

The CSS classes of the text log.

disabled
bool
False

Whether the text log is disabled or not.

auto_scroll instance-attribute class-attribute

auto_scroll: var[bool] = auto_scroll

Automatically scroll to the end on write.

highlight instance-attribute class-attribute

highlight: var[bool] = highlight

Automatically highlight content.

markup instance-attribute class-attribute

markup: var[bool] = markup

Apply Rich console markup.

max_lines instance-attribute class-attribute

max_lines: var[int | None] = max_lines

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

min_width instance-attribute class-attribute

min_width: var[int] = min_width

Minimum width of renderables.

wrap instance-attribute class-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
Parameter Default Description
content
RenderableType | object
required

Rich renderable (or text).

width
int | None
None

Width to render or None to use optimal width.

expand
bool
False

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

shrink
bool
True

Enable shrinking of content to fit width.

scroll_end
bool | None
None

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

Returns
Type Description
Self

The RichLog instance.