prompt-toolkit / prompt-toolkit/python-prompt-toolkit
ConditionalContainer set a space on top
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 10.6k
- Forks
- 815
- PR merge metrics
- No merged PRs in 30d
Description
Hi,
I'm using conditional containers to select which container is shown based on a state variable. Each hidden container is adding a space on top.

#!/usr/bin/env python
"""
A simple example of a few buttons and click handlers.
"""
from prompt_toolkit.application import Application
from prompt_toolkit.application.current import get_app
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.key_binding.bindings.focus import focus_next, focus_previous
from prompt_toolkit.layout import HSplit, Layout, VSplit, HorizontalAlign, VerticalAlign
from prompt_toolkit.styles import Style
from prompt_toolkit.filters import Condition
from prompt_toolkit.completion import WordCompleter
from prompt_toolkit.widgets import Box, Button, Frame, Label, TextArea, Dialog
from prompt_toolkit.layout.containers import (
AnyContainer,
ConditionalContainer,
Container,
DynamicContainer,
Float,
FloatContainer,
HSplit,
VSplit,
Window,
WindowAlign,
)
from asyncio import Future, ensure_future
from prompt_toolkit.layout.menus import CompletionsMenu
from prompt_toolkit.layout.dimension import D
state = "main"
def clicked_main():
global state
state = "main"
layout.focus((main_menu_container.get_children()[0]))
def clicked_item1():
global state
state = "item1"
layout.focus((item1_menu_container.get_children()[0]))
def clicked_item2():
global state
state = "item2"
layout.focus((item2_menu_container.get_children()[0]))
def clicked_item2_item21():
global state
state = "item21"
layout.focus((item21_menu_container.get_children()[0]))
def clicked_exit():
get_app().exit()
# All the widgets for the UI.
btn_item1 = Button("Item 1", handler=clicked_item1)
btn_item2 = Button("Item 2", handler=clicked_item2)
btn_item3 = Button("Item 3", handler=clicked_main)
btn_exit = Button("Exit", handler=clicked_exit)
btn_item1_item11 = Button("Item 1.1", handler=clicked_main)
btn_item1_item12 = Button("Item 1.2", handler=clicked_main)
btn_item1_item13 = Button("Item 1.3", handler=clicked_main)
btn_item2_item21 = Button("Item 2.1", handler=clicked_item2_item21)
btn_item2_item22 = Button("Item 2.2", handler=clicked_main)
btn_item2_item23 = Button("Item 2.3", handler=clicked_main)
btn_item2_item21_item211 = Button("Item 2.1.1", handler=clicked_main)
btn_item2_item21_item212 = Button("Item 2.1.2", handler=clicked_main)
btn_item2_item21_item213 = Button("Item 2.1.3", handler=clicked_main)
#MENU
main_menu_container = ConditionalContainer(
content=HSplit(
[
btn_item1, btn_item2, btn_item3
],
padding=1,
),
filter=Condition(lambda: True if (state == "main") else False),
)
item1_menu_container = ConditionalContainer(
content=HSplit(
[
btn_item1_item11, btn_item1_item12, btn_item1_item13
],
padding=1,
),
filter=Condition(lambda: True if (state == "item1") else False),
)
item2_menu_container = ConditionalContainer(
content=HSplit(
[
btn_item2_item21, btn_item2_item22, btn_item2_item23
],
padding=1,
),
filter=Condition(lambda: True if (state == "item2") else False),
)
item21_menu_container = ConditionalContainer(
content=HSplit(
[
btn_item2_item21_item211, btn_item2_item21_item212, btn_item2_item21_item213
],
padding=1,
),
filter=Condition(lambda: True if (state == "item21") else False),
)
quit_menu_container = VSplit(
[
btn_exit
],
)
root_container = FloatContainer(
content=VSplit(
[
HSplit(
[
main_menu_container,
item1_menu_container,
item2_menu_container,
item21_menu_container,
quit_menu_container,
],
padding=1,
align=HorizontalAlign.LEFT,
),
],
),
floats=[
Float(
xcursor=True,
ycursor=True,
content=CompletionsMenu(max_height=16, scroll_offset=1),
),
],
)
layout = Layout(container=root_container)
# Key bindings.
kb = KeyBindings()
kb.add("down")(focus_next)
kb.add("up")(focus_previous)
# Styling.
style = Style(
[
("button", "#00ff00"),
("button-arrow", "bg:#00ff00"),
("button focused", "bg:#00ff00"),
("text-area focused", "bg:#ff0000"),
("text-area", "bg:#ff0000"),
]
)
# Build a main application object.
application = Application(layout=layout, key_bindings=kb, style=None, full_screen=True)
def main():
application.run()
if __name__ == "__main__":
main()
How can I remove this space?
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Run the provided reproduction through its main() entry point and inspect how ConditionalContainer instances are arranged inside HSplit with padding=1. Trace the layout behavior when the state changes, then verify that hidden containers no longer add vertical space while the visible menu and quit button retain their intended spacing.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- python
- Domain
- cli
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100