class TodoApp(): def __init__(self): self.tasks = [] self.new_task = Textbox(placeholder='Whats needs to be done?', width='100%') self.tasks_view = Stack() # application's root control (i.e. "view") containing all other controls self.view = Stack(width='70%', controls=[ Stack(horizontal=True, on_submit=self.add_clicked, controls=[ self.new_task, Button('Add', on_click=self.add_clicked) ]), self.tasks_view ]) def add_clicked(self, e): task = Task(self, self.new_task.value) self.tasks.append(task) self.tasks_view.controls.append(task.view) self.new_task.value = '' self.view.update() def delete_task(self, task): self.tasks.remove(task) self.tasks_view.controls.remove(task.view) self.view.update()
def __init__(self, app, name): self.app = app self.display_task = Checkbox(value=False, label=name, on_change=self.status_changed) self.edit_name = Textbox(width='100%') self.display_view = Stack( horizontal=True, horizontal_align='space-between', vertical_align='center', controls=[ self.display_task, Stack(horizontal=True, gap='0', controls=[ Button(icon='Edit', title='Edit todo', on_click=self.edit_clicked), Button(icon='Delete', title='Delete todo', on_click=self.delete_clicked) ]), ]) self.edit_view = Stack(visible=False, horizontal=True, horizontal_align='space-between', vertical_align='center', controls=[ self.edit_name, Button(text='Save', on_click=self.save_clicked) ]) self.view = Stack(controls=[self.display_view, self.edit_view])
def test_add_text_inside_stack(): text = Text(id="txt1", value='Hello, "world!"') button = Button(text="Super button") stack = Stack(id="header", controls=[text, button]) assert stack.get_cmd_str() == [ Command(indent=0, name=None, values=["stack"], attrs={"id": ("header", True)}, lines=[], commands=[]), Command( indent=2, name=None, values=["text"], attrs={ "value": 'Hello, "world!"', "id": ("txt1", True) }, lines=[], commands=[], ), Command(indent=2, name=None, values=["button"], attrs={"text": "Super button"}, lines=[], commands=[]), ], "Test failed"
def create_horizontal_stack(horiz_align): return Stack(controls=[ Text(value=horiz_align), Stack(horizontal=True, horizontal_align=horiz_align, vertical_align='center', gap=20, bgcolor=bg_color, controls=items(3)) ])
class Task: def __init__(self, app, name): self.app = app self.display_task = Checkbox( value=False, label=name, on_change=self.status_changed ) self.edit_name = Textbox(width="100%") self.display_view = Stack( horizontal=True, horizontal_align="space-between", vertical_align="center", controls=[ self.display_task, Stack( horizontal=True, gap="0", controls=[ Button( icon="Edit", title="Edit todo", on_click=self.edit_clicked ), Button( icon="Delete", title="Delete todo", on_click=self.delete_clicked, ), ], ), ], ) self.edit_view = Stack( visible=False, horizontal=True, horizontal_align="space-between", vertical_align="center", controls=[self.edit_name, Button(text="Save", on_click=self.save_clicked)], ) self.view = Stack(controls=[self.display_view, self.edit_view]) def edit_clicked(self, e): self.edit_name.value = self.display_task.label self.display_view.visible = False self.edit_view.visible = True self.view.update() def save_clicked(self, e): self.display_task.label = self.edit_name.value self.display_view.visible = True self.edit_view.visible = False self.view.update() def delete_clicked(self, e): self.app.delete_task(self) def status_changed(self, e): self.app.update()
def create_vertical_stack(vert_align): return Stack(width='20%', controls=[ Text(value=vert_align), Stack(vertical_align=vert_align, horizontal_align='center', height=300, gap=20, bgcolor=bg_color, controls=items(3)) ])
def change_items_in_choicegroup(): def add_clicked(e): cg.options.append(choicegroup.Option(new_option.value)) new_option.value = '' stack.update() cg = ChoiceGroup() new_option = Textbox(placeholder='Enter new item name') add = Button("Add", on_click=add_clicked) stack = Stack( controls=[cg, Stack(horizontal=True, controls=[new_option, add])]) return stack
def underlined_borderless_textboxes(): return Stack(controls=[ Stack(gap=25, controls=[ Textbox(label='Underlined', underlined=True, placeholder='Enter text here'), Textbox(label='Borderless', borderless=True, placeholder='Enter text here') ]) ])
def test_stack_add(): s = Stack(controls=[ Textbox(id="firstName"), Textbox(id="lastName") ]) assert isinstance(s, pglet.Control) assert isinstance(s, pglet.Stack) #raise Exception(s.get_cmd_str()) assert s.get_cmd_str() == ( 'stack\n' ' textbox id="firstName"\n' ' textbox id="lastName"' ), "Test failed"
def change_items_in_dropdown(): def add_clicked(e): d.options.append(dropdown.Option(new_option.value)) d.value = new_option.value new_option.value = '' stack.update() d = Dropdown() new_option = Textbox(placeholder='Enter new item name') add = Button("Add", on_click=add_clicked) stack = Stack( controls=[d, Stack(horizontal=True, controls=[new_option, add])]) return stack
def main(page): page.add( Text('Squares', size='large'), Stack(horizontal=True, controls=[ Text('left top', align='left', vertical_align='top', width=100, height=100, bgcolor='salmon', color='white', padding=5), Text('center top', align='center', vertical_align='top', width=100, height=100, bgcolor='salmon', color='white', padding=5, size='large', border='1px solid #555'), Text('right top', align='right', vertical_align='top', width=100, height=100, bgcolor='salmon', color='white', padding=5, border='2px solid #555') ]), Stack(horizontal=True, controls=[ Text('left center', align='left', vertical_align='center', width=100, height=100, bgcolor='PaleGoldenrod', padding=5), Text('center center', align='center', vertical_align='center', width=100, height=100, bgcolor='PaleGoldenrod', padding=5, size='large', border='1px solid #555'), Text('right center', align='right', vertical_align='center', width=100, height=100, bgcolor='PaleGoldenrod', padding=5, border='2px solid #555') ]), Stack(horizontal=True, controls=[ Text('left bottom', align='left', vertical_align='center', width=100, height=100, bgcolor='PaleGreen', padding=5), Text('center bottom', align='center', vertical_align='center', width=100, height=100, bgcolor='PaleGreen', padding=5, size='large', border='1px solid #555'), Text('right bottom', align='right', vertical_align='center', width=100, height=100, bgcolor='PaleGreen', padding=5, border='2px solid #555') ]), Text('Circles', size='large'), Stack(horizontal=True, controls=[ Text('regular', align='center', vertical_align='center', width=100, height=100, border_radius=50, bgcolor='salmon'), Text('bold italic', bold=True, italic=True, align='center', vertical_align='center', width=100, height=100, border_radius=50, bgcolor='PaleGoldenrod', size='large', border='1px solid #555'), Text('bold', bold=True, align='center', vertical_align='center', width=100, height=100, border_radius=50, bgcolor='PaleGreen', border='2px solid #555') ]), Text('Markdown', size='large'), Text(''' # GitHub Flavored Markdown ## Autolink literals www.example.com, https://example.com, and [email protected]. ## Strikethrough ~one~ or ~~two~~ tildes. ### Code sample ``` import pglet page = page.page() ``` ## Table | a | b | c | d | | - | :- | -: | :-: | ''', markdown=True) )
def sliders(): return Stack( width='50%', controls=[ Stack(controls=[ Text("Horizontal sliders", size="xLarge"), Slider(label='Default slider'), Slider(label='Default disabled slider', disabled=True), Slider(label='Slider with value', show_value=True, value=4), Slider(label='Slider with formatted value', show_value=True, min=0, max=100, value=40, value_format='{value}%'), Slider(show_value=True, label='Origin from zero', min=-5, max=15, step=1, value=-2), slider_with_on_change() ]), Text("Vertical sliders", size='xLarge'), Stack(horizontal=True, height='200px', controls=[ Slider(vertical=True, label='Default slider'), Slider(vertical=True, label='Default disabled slider', disabled=True), Slider(vertical=True, label='Slider with value', show_value=True, value=4), Slider(vertical=True, label='Slider with formatted value', show_value=True, min=0, max=100, value=40, value_format='{value}%'), Slider(vertical=True, show_value=True, label='Origin from zero', min=-5, max=15, step=1, value=-2) ]) ])
def regular_buttons(): return Stack(controls=[ Stack(horizontal=True, controls=[ Button("Standard"), Button("Standard disabled", disabled=True) ]), Stack(horizontal=True, controls=[ Button("Primary", primary=True), Button("Primary disabled", primary=True, disabled=True) ]), Stack(horizontal=True, controls=[button_with_on_click()]) ])
def suffix_prefix_textboxes(): return Stack(controls=[ Stack(gap=25, horizontal=True, controls=[ Textbox(label='With prefix', prefix='https://'), Textbox(label='With suffix', suffix='.com') ]), Stack(horizontal=True, controls=[ Textbox(label='With prefix and suffix', prefix='https://', suffix='.com') ]) ])
def __init__(self): self.new_task = Textbox(placeholder='Whats needs to be done?', width='100%') self.tasks_view = Stack() # application's root control (i.e. "view") containing all other controls self.view = Stack(width='70%', controls=[ Stack(horizontal=True, on_submit=self.add_clicked, controls=[ self.new_task, Button('Add', on_click=self.add_clicked) ]), self.tasks_view ])
def main(page): page.update(Page(title="Counter")) page.clean() def on_click(e): try: count = int(page.get_value('number')) #if we get here the number is int page.send('set number errorMessage=""') if e.data == '+': page.set_value('number', count + 1) elif e.data == '-': page.set_value('number', count - 1) except ValueError: page.send('set number errorMessage="Please enter a number"') page.add( Stack(horizontal=True, controls=[ Button(text='-', onclick=on_click, data='-'), Textbox(id='number', value='0', align='right'), Button(text='+', onclick=on_click, data='+'), ]))
def searchbox_with_search_clear_escape(): def enter_clicked(e): messages.controls.append(Text(f'You have searched for {sb.value}.')) sb.value = '' stack.update() def clear_or_esc_clicked(e): messages.controls.append(Text('You have cleared the box.')) stack.update() sb = SearchBox(placeholder='Search something and click Enter, X or Esc', on_search=enter_clicked, on_clear=clear_or_esc_clicked) messages = Stack() stack = Stack(controls=[sb, messages]) return stack
def test_add_controls_to_another_control(page): stack = Stack(id="stack1", horizontal=True) page.add(stack) t1 = page.add(Textbox(id="firstName", label="First name:"), to=stack, at=0) assert t1.id == "stack1:firstName", "Test failed"
def main(page): page.title = "Counter" page.update() def on_click(e): try: count = int(txt_number.value) txt_number.error_message = "" if e.data == "+": txt_number.value = count + 1 elif e.data == "-": txt_number.value = count - 1 except ValueError: txt_number.error_message = "Please enter a number" page.update() txt_number = Textbox(value="0", align="right") page.add( Stack( horizontal=True, controls=[ Button("-", on_click=on_click, data="-"), txt_number, Button("+", on_click=on_click, data="+"), ], ))
def buttons_with_icon(): return Stack(horizontal=True, controls=[ Button("Create account", icon='AddFriend', primary=True), Button("New item", icon='Add'), Button("Delete", icon='Delete') ])
def basic_textboxes(): return Stack(controls=[ Stack(gap=25, horizontal=True, controls=[ Textbox(label='Standard'), Textbox(label='Disabled', disabled=True) ]), Stack(gap=25, horizontal=True, controls=[ Textbox(label='Read-only', read_only=True), Textbox(label="With placeholder", placeholder='Please enter text here') ]), Stack(gap=25, horizontal=True, controls=[ Stack(controls=[ Textbox(label='Required:', required=True), Textbox(required=True) ]), Textbox(label="With error message", error_message='Error message') ]), Stack( gap=25, horizontal=True, controls=[ Textbox(label='With an icon', icon='Emoji2'), #need icon property Textbox(label='Password with reveal button', password=True) ]), Stack(gap=25, horizontal=True, controls=[textbox_with_onchange()]) ])
def multiline_textboxes(): return Stack(controls=[ Stack(gap=25, horizontal=True, controls=[ Textbox(label='standard', multiline=True), Textbox(label='disabled', multiline=True, disabled=True) ]), Stack( gap=25, horizontal=True, controls=[ Textbox(label='With auto adjusted height', multiline=True, auto_adjust_height=True ) #need auto-adjusted height property ]) ])
def checkbox_with_on_change(): def checkbox_changed(e): t.value = f"Checkbox value changed to {c.value}" stack.update() c = Checkbox('Checkbox with on_change event', on_change=checkbox_changed) t = Text() stack = Stack(controls=[c, t]) return stack
class TodoApp(): def __init__(self): self.tasks = [] self.new_task = Textbox(placeholder='Whats needs to be done?', width='100%') self.tasks_view = Stack() self.filter = Tabs(value='all', on_change=self.tabs_changed, tabs=[ Tab(text='all'), Tab(text='active'), Tab(text='completed')]) self.view = Stack(width='70%', controls=[ Text(value='Todos', size='large', align='center'), Stack(horizontal=True, on_submit=self.add_clicked, controls=[ self.new_task, Button(primary=True, text='Add', on_click=self.add_clicked)]), Stack(gap=25, controls=[ self.filter, self.tasks_view ]) ]) def update(self): status = self.filter.value for task in self.tasks: task.view.visible = (status == 'all' or (status == 'active' and task.display_task.value == False) or (status == 'completed' and task.display_task.value)) self.view.update() def add_clicked(self, e): task = Task(self, self.new_task.value) self.tasks.append(task) self.tasks_view.controls.append(task.view) self.new_task.value = '' self.update() def delete_task(self, task): self.tasks.remove(task) self.tasks_view.controls.remove(task.view) self.update() def tabs_changed(self, e): self.update()
def test_splitstack_add(): s = SplitStack( horizontal=True, gutter_size=10, gutter_color="yellow", gutter_hover_color="orange", gutter_drag_color="blue", controls=[Stack(id="left"), Stack(id="center")], ) assert isinstance(s, pglet.Control) assert isinstance(s, pglet.SplitStack) assert s.get_cmd_str() == [ Command( indent=0, name=None, values=["splitstack"], attrs={ "guttercolor": "yellow", "gutterdragcolor": "blue", "gutterhovercolor": "orange", "guttersize": "10", "horizontal": "true", }, lines=[], commands=[], ), Command( indent=2, name=None, values=["stack"], attrs={"id": ("left", True)}, lines=[], commands=[], ), Command( indent=2, name=None, values=["stack"], attrs={"id": ("center", True)}, lines=[], commands=[], ), ], "Test failed"
def slider_with_on_change(): def slider_changed(e): s.data += 1 t.value = f"Slider changed to {int(s.value)}" stack.update() s = Slider('Slider with Change event', on_change=slider_changed, data=0) t = Text() stack = Stack(controls=[s, t]) return stack
def textbox_with_onchange(): def textbox_changed(e): displayed_text.value = entered_text.value stack.update() entered_text = Textbox(label='With onchange event', on_change=textbox_changed) displayed_text = Text() stack = Stack(controls=[entered_text, displayed_text]) return stack
def searchbox_with_change(): def searchbox_changed(e): t.value = f'You have searched for {sb.value}.' stack.update() sb = SearchBox(placeholder='Search something...', on_change=searchbox_changed) t = Text() stack = Stack(controls=[sb, t]) return stack
def main(page): page.title = "Icons example" page.gap = 20 page.update() page.add( Stack(horizontal=True, controls=[ Icon("ChangeEntitlements", color='Magenta20'), Icon("shop", color='CyanBlue10'), Icon("TrainSolid") ]), Stack(horizontal=True, vertical_align='center', controls=[ Icon("BlockedSite", color='Orange20', size=25), Icon("settings", color='Gray20', size=50), Icon("save", color='Blue10', size=100) ]))
def get_stack_controls(search_name): stack_controls = [] found_icon_names = search_icons(search_name) for icon_name in found_icon_names: s = Stack(controls=[ Icon(name = icon_name), Text(value = icon_name) ]) stack_controls.append(s) return stack_controls