diff --git a/src/textual/markup.py b/src/textual/markup.py index 60abb9f5cb..56955c1403 100644 --- a/src/textual/markup.py +++ b/src/textual/markup.py @@ -155,7 +155,7 @@ class StyleTokenizer(TokenizerState): def escape( markup: str, - _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@][^[]*?])").sub, + _escape: _EscapeSubMethod = re.compile(r"(\\*)(\[[a-z#/@](?:[^[\]]*(?:\[[^[\]]*\])?[^[\]]*)*\])").sub, ) -> str: """Escapes text so that it won't be interpreted as markup. diff --git a/src/textual/widgets/_select.py b/src/textual/widgets/_select.py index 568ecd062a..14c45ac6d9 100644 --- a/src/textual/widgets/_select.py +++ b/src/textual/widgets/_select.py @@ -253,9 +253,10 @@ def update(self, label: RenderableType | NoSelection) -> None: """ self.label = label self.has_value = label is not Select.NULL - self.query_one("#label", Static).update( - self.placeholder if isinstance(label, NoSelection) else label - ) + if self.is_mounted: + self.query_one("#label", Static).update( + self.placeholder if isinstance(label, NoSelection) else label + ) def compose(self) -> ComposeResult: """Compose label and down arrow."""