Skip to content

ProgressBar can be caused to crash with CSS since 5.0.0 #6127

@davep

Description

@davep

Given this code:

from textual.app import App, ComposeResult
from textual.widgets import ProgressBar

class WideBarApp(App[None]):

    CSS = """
    ProgressBar Bar {
        width: 1fr;
    }
    """

    def compose(self) -> ComposeResult:
        yield ProgressBar()

if __name__ == "__main__":
    WideBarApp().run()

Up until Textual 4.x, it ran fine. As of Textual 5.0 it causes the following crash (trimmed to the last bit, because the traceback ends up being way too big for a GitHub issue; to the point that it refuses to accept it):

│ /Users/davep/temp/wide-bar/.venv/lib/python3.11/site-packages/textual/widgets/_progress_bar.py:100 in render        │
│                                                                                                                     │
│    97 │   def render(self) -> RenderResult:                                                                         │
│    98 │   │   """Render the bar with the correct portion filled."""                                                 │
│    99 │   │   if self.percentage is None:                                                                           │
│ ❱ 100 │   │   │   return self.render_indeterminate()                                                                │
│   101 │   │   else:                                                                                                 │
│   102 │   │   │   bar_style = (                                                                                     │
│   103 │   │   │   │   self.get_component_rich_style("bar--bar")                                                     │
│                                                                                                                     │
│ ╭─────── locals ───────╮                                                                                            │
│ │ self = Bar(id='bar') │                                                                                            │
│ ╰──────────────────────╯                                                                                            │
│                                                                                                                     │
│ /Users/davep/temp/wide-bar/.venv/lib/python3.11/site-packages/textual/widgets/_progress_bar.py:128 in               │
│ render_indeterminate                                                                                                │
│                                                                                                                     │
│   125 │   │   else:                                                                                                 │
│   126 │   │   │   speed = 30  # Cells per second.                                                                   │
│   127 │   │   │   # Compute the position of the bar.                                                                │
│ ❱ 128 │   │   │   start = (speed * self._clock.time) % (2 * total_imaginary_width)                                  │
│   129 │   │   │   if start > total_imaginary_width:                                                                 │
│   130 │   │   │   │   # If the bar is to the right of its width, wrap it back from right to le                      │
│   131 │   │   │   │   start = 2 * total_imaginary_width - start  # = (tiw - (start - tiw))                          │
│                                                                                                                     │
│ ╭─────────────── locals ────────────────╮                                                                           │
│ │ highlighted_bar_width = 0.0           │                                                                           │
│ │                  self = Bar(id='bar') │                                                                           │
│ │                 speed = 30            │                                                                           │
│ │ total_imaginary_width = 0.0           │                                                                           │
│ │                 width = 0             │                                                                           │
│ ╰───────────────────────────────────────╯                                                                           │
╰─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ZeroDivisionError: float modulo

NOTE: 1 of 2 errors shown. Run with textual run --dev to see all errors.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions