Skip to content

TextLog

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

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

  • Focusable
  • Container

Example

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

TextLogApp │   │   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.table import Table
from rich.syntax import Syntax

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


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 TextLogApp(App):
    def compose(self) -> ComposeResult:
        yield TextLog(highlight=True, markup=True)

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

        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(TextLog)
        text_log.write(event)


if __name__ == "__main__":
    app = TextLogApp()
    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.


textual.widgets.TextLog 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 TextLog instance.

render_lines method

def render_lines(self, crop):

Render the widget in to lines.

Parameters
Name Type Description Default
crop Region

Region within visible area to.

required
Returns
Type Description
list[Strip]

A list of list of segments

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 TextLog instance.