-
-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Open
Description
The following code:
from textual.app import App
class BadPointerApp(App[None]):
CSS = """
* {
pointer: default;
}
"""
def __init__(self) -> None:
super().__init__()
self.theme = "textual-light"
if __name__ == "__main__":
BadPointerApp().run()causes this crash:
╭──────────────────────────────────────────────────────── Traceback (most recent call last) ─────────────────────────────────────────────────────────╮
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py:3676 in refresh_css │
│ │
│ 3673 │ │ stylesheet = self.app.stylesheet │
│ 3674 │ │ stylesheet.set_variables(self.get_css_variables()) │
│ 3675 │ │ stylesheet.reparse() │
│ ❱ 3676 │ │ stylesheet.update(self.app, animate=animate) │
│ 3677 │ │ try: │
│ 3678 │ │ │ if self.screen.is_mounted: │
│ 3679 │ │ │ │ self.screen._refresh_layout(self.size) │
│ │
│ ╭─────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────╮ │
│ │ animate = False │ │
│ │ self = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ │ stylesheet = <Stylesheet │ │
│ │ │ [ │ │
│ │ │ │ ( │ │
│ │ │ │ │ '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', │ │
│ │ │ │ │ 'App.DEFAULT_CSS' │ │
│ │ │ │ ), │ │
│ │ │ │ ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS') │ │
│ │ │ ] │ │
│ │ > │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:711 in update │
│ │
│ 708 │ │ │ animate: Enable CSS animation. │
│ 709 │ │ """ │
│ 710 │ │ │
│ ❱ 711 │ │ self.update_nodes(root.walk_children(with_self=True), animate=animate) │
│ 712 │ │
│ 713 │ def update_nodes(self, nodes: Iterable[DOMNode], animate: bool = False) -> None: │
│ 714 │ │ """Update styles for nodes. │
│ │
│ ╭───────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────╮ │
│ │ animate = False │ │
│ │ root = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ │ self = <Stylesheet │ │
│ │ │ [ │ │
│ │ │ │ ( │ │
│ │ │ │ │ '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', │ │
│ │ │ │ │ 'App.DEFAULT_CSS' │ │
│ │ │ │ ), │ │
│ │ │ │ ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS') │ │
│ │ │ ] │ │
│ │ > │ │
│ ╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:724 in update_nodes │
│ │
│ 721 │ │ apply = self.apply │
│ 722 │ │ │
│ 723 │ │ for node in nodes: │
│ ❱ 724 │ │ │ apply(node, animate=animate, cache=cache) │
│ 725 │ │ │ if isinstance(node, Widget) and node.is_scrollable: │
│ 726 │ │ │ │ show_vertical_scrollbar = ( │
│ 727 │ │ │ │ │ node.show_vertical_scrollbar and node.scrollbar_size_vertical │
│ │
│ ╭──────────────────────────────────────────────────────────────────── locals ────────────────────────────────────────────────────────────────────╮ │
│ │ animate = False │ │
│ │ apply = <bound method Stylesheet.apply of <Stylesheet [('/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', │ │
│ │ 'App.DEFAULT_CSS'), ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS')]>> │ │
│ │ cache = { │ │
│ │ │ (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp'): { │ │
│ │ │ │ 'pointer': 'default', │ │
│ │ │ │ 'auto_background': False, │ │
│ │ │ │ 'background': Color(224, 224, 224), │ │
│ │ │ │ 'auto_color': False, │ │
│ │ │ │ 'color': Color(31, 31, 31) │ │
│ │ │ } │ │
│ │ } │ │
│ │ node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ │ nodes = [BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})] │ │
│ │ self = <Stylesheet │ │
│ │ │ [ │ │
│ │ │ │ ('/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', 'App.DEFAULT_CSS'), │ │
│ │ │ │ ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS') │ │
│ │ │ ] │ │
│ │ > │ │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:606 in apply │
│ │
│ 603 │ │ │ │
│ 604 │ │ │ if cache_key is not None: │
│ 605 │ │ │ │ cache[cache_key] = node_rules │
│ ❱ 606 │ │ │ self.replace_rules(node, node_rules, animate=animate) │
│ 607 │ │ self._process_component_classes(node) │
│ 608 │ │
│ 609 │ def _process_component_classes(self, node: DOMNode) -> None: │
│ │
│ ╭─────────────────────────────────────────────────────────────── locals ───────────────────────────────────────────────────────────────╮ │
│ │ _check_rule = <bound method Stylesheet._check_rule of <class 'textual.css.stylesheet.Stylesheet'>> │ │
│ │ all_pseudo_classes = {'ansi', 'disabled', 'can-focus'} │ │
│ │ animate = False │ │
│ │ base_specificity = (0, 0, 1) │ │
│ │ cache = { │ │
│ │ │ (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp'): { │ │
│ │ │ │ 'pointer': 'default', │ │
│ │ │ │ 'auto_background': False, │ │
│ │ │ │ 'background': Color(224, 224, 224), │ │
│ │ │ │ 'auto_color': False, │ │
│ │ │ │ 'color': Color(31, 31, 31) │ │
│ │ │ } │ │
│ │ } │ │
│ │ cache_key = (None, None, frozenset({'-light-mode'}), (), 'BadPointerApp') │ │
│ │ cached_result = None │ │
│ │ css_path_nodes = [BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'})] │ │
│ │ get_first_item = operator.itemgetter(0) │ │
│ │ initial = set() │ │
│ │ initial_defaults = set() │ │
│ │ is_default_rules = True │ │
│ │ key = 'color' │ │
│ │ limit_rules = { │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App' (0, 0, 1)>], │ │
│ │ │ │ styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-1, │ │
│ │ │ │ selector_names={'App'}, │ │
│ │ │ │ pseudo_classes=set() │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App *' (0, 2, 0)>], │ │
│ │ │ │ styles=Styles(opacity=0.7), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-1, │ │
│ │ │ │ selector_names={'*'}, │ │
│ │ │ │ pseudo_classes={'disabled', 'can-focus'} │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>], │ │
│ │ │ │ styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1), background=Color(0, 0, 0, ansi=-1)), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-2, │ │
│ │ │ │ selector_names={'App'}, │ │
│ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet '*' (0, 0, 0)>], │ │
│ │ │ │ styles=Styles(pointer='default'), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=False, │ │
│ │ │ │ tie_breaker=0, │ │
│ │ │ │ selector_names={'*'}, │ │
│ │ │ │ pseudo_classes=set() │ │
│ │ │ ) │ │
│ │ } │ │
│ │ node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ │ node_rules = { │ │
│ │ │ 'pointer': 'default', │ │
│ │ │ 'auto_background': False, │ │
│ │ │ 'background': Color(224, 224, 224), │ │
│ │ │ 'auto_color': False, │ │
│ │ │ 'color': Color(31, 31, 31) │ │
│ │ } │ │
│ │ rule = RuleSet( │ │
│ │ │ selector_set=[<SelectorSet 'App' (0, 0, 1)>], │ │
│ │ │ styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)), │ │
│ │ │ errors=[], │ │
│ │ │ is_default_rules=True, │ │
│ │ │ tie_breaker=-1, │ │
│ │ │ selector_names={'App'}, │ │
│ │ │ pseudo_classes=set() │ │
│ │ ) │ │
│ │ rule_attributes = defaultdict(<class 'list'>, { │ │
│ │ │ 'pointer': [((1, 0, 0, 0, 0, 0), 'default')], │ │
│ │ │ 'auto_background': [((0, 0, 0, 0, 1, -1), False)], │ │
│ │ │ 'background': [((0, 0, 0, 0, 1, -1), Color(224, 224, 224))], │ │
│ │ │ 'auto_color': [((0, 0, 0, 0, 1, -1), False)], │ │
│ │ │ 'color': [((0, 0, 0, 0, 1, -1), Color(31, 31, 31))] │ │
│ │ }) │ │
│ │ rule_specificity = (0, 0, 0, 0, 1, -1) │ │
│ │ rules = [ │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet '*' (0, 0, 0)>], │ │
│ │ │ │ styles=Styles(pointer='default'), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=False, │ │
│ │ │ │ tie_breaker=0, │ │
│ │ │ │ selector_names={'*'}, │ │
│ │ │ │ pseudo_classes=set() │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App *' (0, 2, 0)>], │ │
│ │ │ │ styles=Styles(opacity=0.7), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-1, │ │
│ │ │ │ selector_names={'*'}, │ │
│ │ │ │ pseudo_classes={'disabled', 'can-focus'} │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>], │ │
│ │ │ │ styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1), background=Color(0, 0, 0, ansi=-1)), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-2, │ │
│ │ │ │ selector_names={'App'}, │ │
│ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ ), │ │
│ │ │ RuleSet( │ │
│ │ │ │ selector_set=[<SelectorSet 'App' (0, 0, 1)>], │ │
│ │ │ │ styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)), │ │
│ │ │ │ errors=[], │ │
│ │ │ │ is_default_rules=True, │ │
│ │ │ │ tie_breaker=-1, │ │
│ │ │ │ selector_names={'App'}, │ │
│ │ │ │ pseudo_classes=set() │ │
│ │ │ ) │ │
│ │ ] │ │
│ │ rules_map = { │ │
│ │ │ 'App': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App' (0, 0, 1)>], │ │
│ │ │ │ │ styles=Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224)), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-1, │ │
│ │ │ │ │ selector_names={'App'}, │ │
│ │ │ │ │ pseudo_classes=set() │ │
│ │ │ │ ), │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi' (0, 1, 1)>], │ │
│ │ │ │ │ styles=Styles( │ │
│ │ │ │ │ │ auto_color=False, │ │
│ │ │ │ │ │ color=Color(0, 0, 0, ansi=-1), │ │
│ │ │ │ │ │ background=Color(0, 0, 0, ansi=-1) │ │
│ │ │ │ │ ), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-2, │ │
│ │ │ │ │ selector_names={'App'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.-ansi-scrollbar': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi .-ansi-scrollbar' (0, 2, 1)>], │ │
│ │ │ │ │ styles=Styles( │ │
│ │ │ │ │ │ scrollbar_color=Color(0, 0, 128, ansi=4), │ │
│ │ │ │ │ │ scrollbar_color_hover=Color(0, 0, 255, ansi=12), │ │
│ │ │ │ │ │ scrollbar_color_active=Color(0, 0, 255, ansi=12), │ │
│ │ │ │ │ │ scrollbar_corner_color=Color(0, 0, 0, ansi=-1), │ │
│ │ │ │ │ │ scrollbar_background=Color(0, 0, 0, ansi=-1), │ │
│ │ │ │ │ │ scrollbar_background_hover=Color(0, 0, 0, ansi=-1), │ │
│ │ │ │ │ │ scrollbar_background_active=Color(0, 0, 0, ansi=-1) │ │
│ │ │ │ │ ), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.-ansi-scrollbar'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.bindings-table--key': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi .bindings-table--key' (0, 2, 1)>], │ │
│ │ │ │ │ styles=Styles(auto_color=False, color=Color(128, 0, 128, ansi=5)), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.bindings-table--key'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.bindings-table--description': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi .bindings-table--description' (0, 2, 1)>], │ │
│ │ │ │ │ styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1)), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.bindings-table--description'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.bindings-table--header': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi .bindings-table--header' (0, 2, 1)>], │ │
│ │ │ │ │ styles=Styles(auto_color=False, color=Color(0, 0, 0, ansi=-1)), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.bindings-table--header'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.bindings-table--divider': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:ansi .bindings-table--divider' (0, 2, 1)>], │ │
│ │ │ │ │ styles=Styles(auto_color=False, color=Color(0, 0, 0, a=0), text_style='dim'), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.bindings-table--divider'}, │ │
│ │ │ │ │ pseudo_classes={'ansi'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.-maximized-view': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App Screen.-maximized-view' (0, 1, 2)>], │ │
│ │ │ │ │ styles=Styles( │ │
│ │ │ │ │ │ layout=<vertical>, │ │
│ │ │ │ │ │ overflow_y='auto', │ │
│ │ │ │ │ │ align_horizontal='center', │ │
│ │ │ │ │ │ align_vertical='middle', │ │
│ │ │ │ │ │ hatch=('╱', Color(208, 208, 208)), │ │
│ │ │ │ │ │ important={'overflow_y', 'layout'} │ │
│ │ │ │ │ ), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-2, │ │
│ │ │ │ │ selector_names={'.-maximized-view'}, │ │
│ │ │ │ │ pseudo_classes=set() │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '.-maximized': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App Screen.-maximized-view .-maximized' (0, 2, 2)>], │ │
│ │ │ │ │ styles=Styles(dock=None, important={'dock'}), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-3, │ │
│ │ │ │ │ selector_names={'.-maximized'}, │ │
│ │ │ │ │ pseudo_classes=set() │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ 'HeaderTitle': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App:blur HeaderTitle' (0, 1, 2)>], │ │
│ │ │ │ │ styles=Styles(text_opacity=0.5), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-2, │ │
│ │ │ │ │ selector_names={'HeaderTitle'}, │ │
│ │ │ │ │ pseudo_classes={'blur'} │ │
│ │ │ │ ) │ │
│ │ │ ], │ │
│ │ │ '*': [ │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet 'App *' (0, 2, 0)>], │ │
│ │ │ │ │ styles=Styles(opacity=0.7), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=True, │ │
│ │ │ │ │ tie_breaker=-1, │ │
│ │ │ │ │ selector_names={'*'}, │ │
│ │ │ │ │ pseudo_classes={'disabled', 'can-focus'} │ │
│ │ │ │ ), │ │
│ │ │ │ RuleSet( │ │
│ │ │ │ │ selector_set=[<SelectorSet '*' (0, 0, 0)>], │ │
│ │ │ │ │ styles=Styles(pointer='default'), │ │
│ │ │ │ │ errors=[], │ │
│ │ │ │ │ is_default_rules=False, │ │
│ │ │ │ │ tie_breaker=0, │ │
│ │ │ │ │ selector_names={'*'}, │ │
│ │ │ │ │ pseudo_classes=set() │ │
│ │ │ │ ) │ │
│ │ │ ] │ │
│ │ } │ │
│ │ self = <Stylesheet │ │
│ │ │ [ │ │
│ │ │ │ ( │ │
│ │ │ │ │ '/Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py', │ │
│ │ │ │ │ 'App.DEFAULT_CSS' │ │
│ │ │ │ ), │ │
│ │ │ │ ('/Users/davep/temp/bad-pointer/main.py', 'BadPointerApp.CSS') │ │
│ │ │ ] │ │
│ │ > │ │
│ │ tie_breaker = -1 │ │
│ │ value = Color(31, 31, 31) │ │
│ ╰──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/css/stylesheet.py:700 in replace_rules │
│ │
│ 697 │ │ │ get_rule = rules.get │
│ 698 │ │ │ │
│ 699 │ │ │ for key in modified_rule_keys: │
│ ❱ 700 │ │ │ │ setattr(base_styles, key, get_rule(key)) │
│ 701 │ │ node.notify_style_update() │
│ 702 │ │
│ 703 │ def update(self, root: DOMNode, animate: bool = False) -> None: │
│ │
│ ╭────────────────────────────────────────────────────────── locals ──────────────────────────────────────────────────────────╮ │
│ │ animate = False │ │
│ │ base_styles = Styles(auto_color=False, color=Color(31, 31, 31), background=Color(224, 224, 224), pointer='default') │ │
│ │ get_rule = <built-in method get of dict object at 0x10b834b40> │ │
│ │ key = 'pointer' │ │
│ │ modified_rule_keys = {'color', 'background', 'auto_color', 'auto_background', 'pointer'} │ │
│ │ node = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ │ rules = { │ │
│ │ │ 'pointer': 'default', │ │
│ │ │ 'auto_background': False, │ │
│ │ │ 'background': Color(224, 224, 224), │ │
│ │ │ 'auto_color': False, │ │
│ │ │ 'color': Color(31, 31, 31) │ │
│ │ } │ │
│ │ styles = RenderStyles( │ │
│ │ │ BadPointerApp( │ │
│ │ │ │ title='BadPointerApp', │ │
│ │ │ │ classes={'-light-mode'}, │ │
│ │ │ │ pseudo_classes={'light', 'focus'} │ │
│ │ │ ), │ │
│ │ │ auto_color=False, │ │
│ │ │ color=Color(31, 31, 31), │ │
│ │ │ background=Color(224, 224, 224), │ │
│ │ │ pointer='default' │ │
│ │ ) │ │
│ ╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
│ │
│ /Users/davep/temp/bad-pointer/.venv/lib/python3.13/site-packages/textual/app.py:1544 in screen │
│ │
│ 1541 │ │ except KeyError: │
│ 1542 │ │ │ raise UnknownModeError(f"No known mode {self._current_mode!r}") from None │
│ 1543 │ │ except IndexError: │
│ ❱ 1544 │ │ │ raise ScreenStackError("No screens on stack") from None │
│ 1545 │ │
│ 1546 │ @property │
│ 1547 │ def _background_screens(self) -> list[Screen]: │
│ │
│ ╭──────────────────────────────────────────────── locals ─────────────────────────────────────────────────╮ │
│ │ self = BadPointerApp(title='BadPointerApp', classes={'-light-mode'}, pseudo_classes={'light', 'focus'}) │ │
│ ╰─────────────────────────────────────────────────────────────────────────────────────────────────────────╯ │
╰────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
ScreenStackError: No screens on stack
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
No labels