Skip to content

Commit 988c4b3

Browse files
authored
Merge pull request #4802 from Textualize/recompose-mount-fix
Recompose mount fix
2 parents 1d0474f + f59e204 commit 988c4b3

File tree

6 files changed

+231
-13
lines changed

6 files changed

+231
-13
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1212
- Fixed issues in Kitty terminal after exiting app https://github.com/Textualize/textual/issues/4779
1313
- Fixed exception when removing Selects https://github.com/Textualize/textual/pull/4786
1414
- Fixed issue with non-clickable Footer keys https://github.com/Textualize/textual/pull/4798
15+
- Fixed issue with recompose not working from Mount handler https://github.com/Textualize/textual/pull/4802
1516

1617
### Changed
1718

src/textual/reactive.py

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -132,15 +132,18 @@ def __init__(
132132
self._recompose = recompose
133133
self._bindings = bindings
134134
self._owner: Type[MessageTarget] | None = None
135+
self.name: str
135136

136137
def __rich_repr__(self) -> rich.repr.Result:
137-
yield self._default
138-
yield "layout", self._layout
139-
yield "repaint", self._repaint
140-
yield "init", self._init
141-
yield "always_update", self._always_update
142-
yield "compute", self._run_compute
143-
yield "recompose", self._recompose
138+
yield None, self._default
139+
yield "layout", self._layout, False
140+
yield "repaint", self._repaint, True
141+
yield "init", self._init, False
142+
yield "always_update", self._always_update, False
143+
yield "compute", self._run_compute, True
144+
yield "recompose", self._recompose, False
145+
yield "bindings", self._bindings, False
146+
yield "name", getattr(self, "name", None), None
144147

145148
@property
146149
def owner(self) -> Type[MessageTarget]:

src/textual/widget.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3473,17 +3473,17 @@ def refresh(
34733473
break
34743474
ancestor._clear_arrangement_cache()
34753475

3476-
if not self._is_mounted:
3477-
self._repaint_required = True
3478-
self.check_idle()
3479-
return self
3480-
34813476
if recompose:
34823477
self._recompose_required = True
34833478
self.call_next(self._check_recompose)
34843479
return self
34853480

3486-
elif repaint:
3481+
if not self._is_mounted:
3482+
self._repaint_required = True
3483+
self.check_idle()
3484+
return self
3485+
3486+
if repaint:
34873487
self._set_dirty(*regions)
34883488
self.clear_cached_dimensions()
34893489
self._rich_style_cache.clear()

tests/snapshot_tests/__snapshots__/test_snapshots.ambr

Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35396,6 +35396,170 @@
3539635396

3539735397
'''
3539835398
# ---
35399+
# name: test_recompose_in_mount
35400+
'''
35401+
<svg class="rich-terminal" viewBox="0 0 994 635.5999999999999" xmlns="http://www.w3.org/2000/svg">
35402+
<!-- Generated with Rich https://www.textualize.io -->
35403+
<style>
35404+
35405+
@font-face {
35406+
font-family: "Fira Code";
35407+
src: local("FiraCode-Regular"),
35408+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Regular.woff2") format("woff2"),
35409+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Regular.woff") format("woff");
35410+
font-style: normal;
35411+
font-weight: 400;
35412+
}
35413+
@font-face {
35414+
font-family: "Fira Code";
35415+
src: local("FiraCode-Bold"),
35416+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff2/FiraCode-Bold.woff2") format("woff2"),
35417+
url("https://cdnjs.cloudflare.com/ajax/libs/firacode/6.2.0/woff/FiraCode-Bold.woff") format("woff");
35418+
font-style: bold;
35419+
font-weight: 700;
35420+
}
35421+
35422+
.terminal-2941274102-matrix {
35423+
font-family: Fira Code, monospace;
35424+
font-size: 20px;
35425+
line-height: 24.4px;
35426+
font-variant-east-asian: full-width;
35427+
}
35428+
35429+
.terminal-2941274102-title {
35430+
font-size: 18px;
35431+
font-weight: bold;
35432+
font-family: arial;
35433+
}
35434+
35435+
.terminal-2941274102-r1 { fill: #c5c8c6 }
35436+
.terminal-2941274102-r2 { fill: #e3e3e3 }
35437+
.terminal-2941274102-r3 { fill: #e1e1e1 }
35438+
.terminal-2941274102-r4 { fill: #1e1e1e }
35439+
.terminal-2941274102-r5 { fill: #0178d4 }
35440+
.terminal-2941274102-r6 { fill: #575757 }
35441+
.terminal-2941274102-r7 { fill: #262626;font-weight: bold }
35442+
.terminal-2941274102-r8 { fill: #e2e2e2 }
35443+
.terminal-2941274102-r9 { fill: #e2e2e2;text-decoration: underline; }
35444+
.terminal-2941274102-r10 { fill: #434343 }
35445+
.terminal-2941274102-r11 { fill: #e2e3e3 }
35446+
</style>
35447+
35448+
<defs>
35449+
<clipPath id="terminal-2941274102-clip-terminal">
35450+
<rect x="0" y="0" width="975.0" height="584.5999999999999" />
35451+
</clipPath>
35452+
<clipPath id="terminal-2941274102-line-0">
35453+
<rect x="0" y="1.5" width="976" height="24.65"/>
35454+
</clipPath>
35455+
<clipPath id="terminal-2941274102-line-1">
35456+
<rect x="0" y="25.9" width="976" height="24.65"/>
35457+
</clipPath>
35458+
<clipPath id="terminal-2941274102-line-2">
35459+
<rect x="0" y="50.3" width="976" height="24.65"/>
35460+
</clipPath>
35461+
<clipPath id="terminal-2941274102-line-3">
35462+
<rect x="0" y="74.7" width="976" height="24.65"/>
35463+
</clipPath>
35464+
<clipPath id="terminal-2941274102-line-4">
35465+
<rect x="0" y="99.1" width="976" height="24.65"/>
35466+
</clipPath>
35467+
<clipPath id="terminal-2941274102-line-5">
35468+
<rect x="0" y="123.5" width="976" height="24.65"/>
35469+
</clipPath>
35470+
<clipPath id="terminal-2941274102-line-6">
35471+
<rect x="0" y="147.9" width="976" height="24.65"/>
35472+
</clipPath>
35473+
<clipPath id="terminal-2941274102-line-7">
35474+
<rect x="0" y="172.3" width="976" height="24.65"/>
35475+
</clipPath>
35476+
<clipPath id="terminal-2941274102-line-8">
35477+
<rect x="0" y="196.7" width="976" height="24.65"/>
35478+
</clipPath>
35479+
<clipPath id="terminal-2941274102-line-9">
35480+
<rect x="0" y="221.1" width="976" height="24.65"/>
35481+
</clipPath>
35482+
<clipPath id="terminal-2941274102-line-10">
35483+
<rect x="0" y="245.5" width="976" height="24.65"/>
35484+
</clipPath>
35485+
<clipPath id="terminal-2941274102-line-11">
35486+
<rect x="0" y="269.9" width="976" height="24.65"/>
35487+
</clipPath>
35488+
<clipPath id="terminal-2941274102-line-12">
35489+
<rect x="0" y="294.3" width="976" height="24.65"/>
35490+
</clipPath>
35491+
<clipPath id="terminal-2941274102-line-13">
35492+
<rect x="0" y="318.7" width="976" height="24.65"/>
35493+
</clipPath>
35494+
<clipPath id="terminal-2941274102-line-14">
35495+
<rect x="0" y="343.1" width="976" height="24.65"/>
35496+
</clipPath>
35497+
<clipPath id="terminal-2941274102-line-15">
35498+
<rect x="0" y="367.5" width="976" height="24.65"/>
35499+
</clipPath>
35500+
<clipPath id="terminal-2941274102-line-16">
35501+
<rect x="0" y="391.9" width="976" height="24.65"/>
35502+
</clipPath>
35503+
<clipPath id="terminal-2941274102-line-17">
35504+
<rect x="0" y="416.3" width="976" height="24.65"/>
35505+
</clipPath>
35506+
<clipPath id="terminal-2941274102-line-18">
35507+
<rect x="0" y="440.7" width="976" height="24.65"/>
35508+
</clipPath>
35509+
<clipPath id="terminal-2941274102-line-19">
35510+
<rect x="0" y="465.1" width="976" height="24.65"/>
35511+
</clipPath>
35512+
<clipPath id="terminal-2941274102-line-20">
35513+
<rect x="0" y="489.5" width="976" height="24.65"/>
35514+
</clipPath>
35515+
<clipPath id="terminal-2941274102-line-21">
35516+
<rect x="0" y="513.9" width="976" height="24.65"/>
35517+
</clipPath>
35518+
<clipPath id="terminal-2941274102-line-22">
35519+
<rect x="0" y="538.3" width="976" height="24.65"/>
35520+
</clipPath>
35521+
</defs>
35522+
35523+
<rect fill="#292929" stroke="rgba(255,255,255,0.35)" stroke-width="1" x="1" y="1" width="992" height="633.6" rx="8"/><text class="terminal-2941274102-title" fill="#c5c8c6" text-anchor="middle" x="496" y="27">ForecastApp</text>
35524+
<g transform="translate(26,22)">
35525+
<circle cx="0" cy="0" r="7" fill="#ff5f57"/>
35526+
<circle cx="22" cy="0" r="7" fill="#febc2e"/>
35527+
<circle cx="44" cy="0" r="7" fill="#28c840"/>
35528+
</g>
35529+
35530+
<g transform="translate(9, 41)" clip-path="url(#terminal-2941274102-clip-terminal)">
35531+
<rect fill="#282828" x="0" y="1.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="12.2" y="1.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="24.4" y="1.5" width="378.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="402.6" y="1.5" width="134.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="536.8" y="1.5" width="329.4" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="866.2" y="1.5" width="0" height="24.65" shape-rendering="crispEdges"/><rect fill="#282828" x="866.2" y="1.5" width="109.8" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="25.9" width="109.8" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="109.8" y="25.9" width="866.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#0178d4" x="0" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="12.2" y="50.3" width="122" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="134.2" y="50.3" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="146.4" y="50.3" width="829.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#0178d4" x="0" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="12.2" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="24.4" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#575757" x="36.6" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="48.8" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="61" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="73.2" y="74.7" width="36.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="109.8" y="74.7" width="24.4" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="134.2" y="74.7" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="146.4" y="74.7" width="829.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#0178d4" x="0" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="12.2" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="24.4" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#434343" x="36.6" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="48.8" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="61" y="99.1" width="48.8" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="109.8" y="99.1" width="24.4" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="134.2" y="99.1" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="146.4" y="99.1" width="829.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#0178d4" x="0" y="123.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#262626" x="12.2" y="123.5" width="122" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="134.2" y="123.5" width="12.2" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="146.4" y="123.5" width="829.6" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="147.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="172.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="196.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="221.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="245.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="269.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="294.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="318.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="343.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="367.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="391.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="416.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="440.7" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="465.1" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="489.5" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="513.9" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#1e1e1e" x="0" y="538.3" width="976" height="24.65" shape-rendering="crispEdges"/><rect fill="#24292f" x="0" y="562.7" width="976" height="24.65" shape-rendering="crispEdges"/>
35532+
<g class="terminal-2941274102-matrix">
35533+
<text class="terminal-2941274102-r2" x="12.2" y="20" textLength="12.2" clip-path="url(#terminal-2941274102-line-0)">⭘</text><text class="terminal-2941274102-r2" x="402.6" y="20" textLength="134.2" clip-path="url(#terminal-2941274102-line-0)">ForecastApp</text><text class="terminal-2941274102-r1" x="976" y="20" textLength="12.2" clip-path="url(#terminal-2941274102-line-0)">
35534+
</text><text class="terminal-2941274102-r3" x="0" y="44.4" textLength="109.8" clip-path="url(#terminal-2941274102-line-1)">&#160;Profile&#160;</text><text class="terminal-2941274102-r1" x="976" y="44.4" textLength="12.2" clip-path="url(#terminal-2941274102-line-1)">
35535+
</text><text class="terminal-2941274102-r4" x="0" y="68.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-2)">▊</text><text class="terminal-2941274102-r5" x="12.2" y="68.8" textLength="122" clip-path="url(#terminal-2941274102-line-2)">▔▔▔▔▔▔▔▔▔▔</text><text class="terminal-2941274102-r5" x="134.2" y="68.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-2)">▎</text><text class="terminal-2941274102-r1" x="976" y="68.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-2)">
35536+
</text><text class="terminal-2941274102-r4" x="0" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">▊</text><text class="terminal-2941274102-r6" x="24.4" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">▐</text><text class="terminal-2941274102-r7" x="36.6" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">●</text><text class="terminal-2941274102-r6" x="48.8" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">▌</text><text class="terminal-2941274102-r9" x="73.2" y="93.2" textLength="36.6" clip-path="url(#terminal-2941274102-line-3)">Foo</text><text class="terminal-2941274102-r5" x="134.2" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">▎</text><text class="terminal-2941274102-r1" x="976" y="93.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-3)">
35537+
</text><text class="terminal-2941274102-r4" x="0" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">▊</text><text class="terminal-2941274102-r10" x="24.4" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">▐</text><text class="terminal-2941274102-r7" x="36.6" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">●</text><text class="terminal-2941274102-r10" x="48.8" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">▌</text><text class="terminal-2941274102-r8" x="61" y="117.6" textLength="48.8" clip-path="url(#terminal-2941274102-line-4)">&#160;Bar</text><text class="terminal-2941274102-r5" x="134.2" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">▎</text><text class="terminal-2941274102-r1" x="976" y="117.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-4)">
35538+
</text><text class="terminal-2941274102-r4" x="0" y="142" textLength="12.2" clip-path="url(#terminal-2941274102-line-5)">▊</text><text class="terminal-2941274102-r5" x="12.2" y="142" textLength="122" clip-path="url(#terminal-2941274102-line-5)">▁▁▁▁▁▁▁▁▁▁</text><text class="terminal-2941274102-r5" x="134.2" y="142" textLength="12.2" clip-path="url(#terminal-2941274102-line-5)">▎</text><text class="terminal-2941274102-r1" x="976" y="142" textLength="12.2" clip-path="url(#terminal-2941274102-line-5)">
35539+
</text><text class="terminal-2941274102-r1" x="976" y="166.4" textLength="12.2" clip-path="url(#terminal-2941274102-line-6)">
35540+
</text><text class="terminal-2941274102-r1" x="976" y="190.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-7)">
35541+
</text><text class="terminal-2941274102-r1" x="976" y="215.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-8)">
35542+
</text><text class="terminal-2941274102-r1" x="976" y="239.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-9)">
35543+
</text><text class="terminal-2941274102-r1" x="976" y="264" textLength="12.2" clip-path="url(#terminal-2941274102-line-10)">
35544+
</text><text class="terminal-2941274102-r1" x="976" y="288.4" textLength="12.2" clip-path="url(#terminal-2941274102-line-11)">
35545+
</text><text class="terminal-2941274102-r1" x="976" y="312.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-12)">
35546+
</text><text class="terminal-2941274102-r1" x="976" y="337.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-13)">
35547+
</text><text class="terminal-2941274102-r1" x="976" y="361.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-14)">
35548+
</text><text class="terminal-2941274102-r1" x="976" y="386" textLength="12.2" clip-path="url(#terminal-2941274102-line-15)">
35549+
</text><text class="terminal-2941274102-r1" x="976" y="410.4" textLength="12.2" clip-path="url(#terminal-2941274102-line-16)">
35550+
</text><text class="terminal-2941274102-r1" x="976" y="434.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-17)">
35551+
</text><text class="terminal-2941274102-r1" x="976" y="459.2" textLength="12.2" clip-path="url(#terminal-2941274102-line-18)">
35552+
</text><text class="terminal-2941274102-r1" x="976" y="483.6" textLength="12.2" clip-path="url(#terminal-2941274102-line-19)">
35553+
</text><text class="terminal-2941274102-r1" x="976" y="508" textLength="12.2" clip-path="url(#terminal-2941274102-line-20)">
35554+
</text><text class="terminal-2941274102-r1" x="976" y="532.4" textLength="12.2" clip-path="url(#terminal-2941274102-line-21)">
35555+
</text><text class="terminal-2941274102-r1" x="976" y="556.8" textLength="12.2" clip-path="url(#terminal-2941274102-line-22)">
35556+
</text>
35557+
</g>
35558+
</g>
35559+
</svg>
35560+
35561+
'''
35562+
# ---
3539935563
# name: test_remove_with_auto_height
3540035564
'''
3540135565
<svg class="rich-terminal" viewBox="0 0 994 635.5999999999999" xmlns="http://www.w3.org/2000/svg">
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from __future__ import annotations
2+
3+
from textual.app import App, ComposeResult
4+
from textual.screen import Screen
5+
from textual.widgets import Header, Footer, Static, RadioSet
6+
from textual.reactive import reactive
7+
8+
9+
class Profile(Static):
10+
choices: reactive[list[str]] = reactive(list, recompose=True)
11+
12+
def compose(self) -> ComposeResult:
13+
yield RadioSet(*self.choices)
14+
15+
async def on_mount(self) -> None:
16+
self.choices.append("Foo")
17+
self.choices.append("Bar")
18+
self.mutate_reactive(Profile.choices)
19+
20+
21+
class Landing(Screen):
22+
def compose(self) -> ComposeResult:
23+
"""Create child widgets for the app."""
24+
yield Header()
25+
yield Static(" Profile ", id="title")
26+
yield Profile()
27+
yield Footer()
28+
29+
30+
class ForecastApp(App):
31+
"""A Textual app to forecast Financials."""
32+
33+
def compose(self) -> ComposeResult:
34+
"""Create child widgets for the app."""
35+
yield Header()
36+
yield Footer()
37+
38+
def on_mount(self) -> None:
39+
self.install_screen(Landing(), name="landing")
40+
self.push_screen("landing")
41+
42+
43+
if __name__ == "__main__":
44+
app = ForecastApp()
45+
app.run()

0 commit comments

Comments
 (0)