def help_menu(root: Container) -> None: """A menu to display various commands""" commands = [ ("help, ?", "show help menu"), ("search, /", "search for a person "), ("convert, $", "convert between USD and BEZO"), ] help_root = outer_container() help_root += Label("[bold 72]Help Menu") help_inner = Container() help_root += help_inner for name, text in commands: row = Splitter() row.arrangement = "20;30" row += Label("[157]" + name, align=Label.ALIGN_LEFT) row += Label("[italic 239]" + text, align=Label.ALIGN_RIGHT) help_inner += row fade_widget(root) help_root.center() help_root.print() getch() fade_widget(root, True)
def outer_container(): """Return an outer-styled Container()""" cont = Container() cont.set_style("border", lambda depth, item: foreground(item, 239)) cont.set_style("corner", lambda depth, item: foreground(item, 239)) return cont
def create_container(height: int = 0): """Create container with the same data""" container = Container(vert_align=Container.VERT_ALIGN_TOP) container.set_char("border", ["│ ", "─", " │", "─"]) container.set_char("corner", ["╭", "╮", "╯", "╰"]) container += InputField( prompt=("you cant edit this.\n" + "-------------------\n"), value=("this is some\n" + "example value\n" + "second line\n\n\n\n" + "have a nice day!"), ) container.forced_height = height return container
def generate_layout(): """Generate home screen layout""" boxes.DOUBLE_TOP.set_chars_of(Container) Container.set_style("border", lambda depth, item: foreground(item, 234)) Container.set_style("corner", lambda depth, item: foreground(item, 234)) Splitter.set_style("separator", lambda depth, item: foreground(item, 234)) Splitter.set_char("separator", boxes.DOUBLE_TOP.borders[0]) corners = boxes.DOUBLE_TOP.corners.copy() corners[0] += " bezo " corners[1] = " calc " + corners[1] root = outer_container() root.set_char("corner", corners) root.forced_height = 32 root.vert_align = Container.VERT_ALIGN_TOP header = Container() + Label("title") header[-1].id = "header_title" root += header inner = Container() inner.id = "inner" inner_title = (Splitter("39;36;36") + Label("[242 bold]Name:") + Label("[242 bold]Worth in dollars:") + Label("[242 bold]Worth in Bezos:")) inner_title.id = "inner_title" inner += inner_title for i in range(24): row = Splitter("39;36;36") if i > 0: row.id = f"inner_row{i - 1}" row += Label(align=Label.ALIGN_LEFT) row += Label() row += Label() inner += row root += inner root += Label() field = InputField(prompt=" ") field.id = "field" root += field with open(to_local(LAYOUT_DIR + "/bezos.ptg"), "w") as datafile: serializer.dump_to_file(root, datafile)
""" from pytermgui import ( Container, Prompt, Label, Splitter, alt_buffer, getch, ListView, ColorPicker, real_length, ) with alt_buffer(cursor=False): Container.set_char("border", ["│ ", "─", " │", "─"]) Container.set_char("corner", ["╭", "╮", "╯", "╰"]) Splitter.set_char("separator", " ") main = Container(horiz_align=Container.HORIZ_ALIGN_LEFT) header = Splitter() header += Label("color picker one:", Label.ALIGN_LEFT) # header += Label("one", Label.ALIGN_CENTER) # header += Label("onne", Label.ALIGN_CENTER) # header += Label("onne", Label.ALIGN_CENTER) header += Label("color picker two:", Label.ALIGN_RIGHT) splitter = Splitter() splitter += ColorPicker(16) splitter += ColorPicker(16)
"have a nice day!"), ) container.forced_height = height return container def field() -> InputField: return selected[0] with alt_buffer(cursor=False): InputField.set_style("cursor", lambda depth, item: color(item, 72)) main = Container(vert_align=Container.VERT_ALIGN_TOP) splitter = Splitter() left = create_container(30) splitter += left right = create_container(30) splitter += right main += Container() + splitter main.set_char("border", ["|x| ", "=", " |x|", "="]) main.forced_width = 120 fields = [left, right] selected = left field().focus()
def convert_menu(root: Container, bezo: int) -> None: """A menu to convert between BEZO and USD""" convert_root = outer_container() convert_root.forced_width = 70 convert_root += Label("[bold 72]Convert Menu") convert_inner = Container() convert_root += convert_inner for name in ["[157]$USD", "[208]BEZO"]: row = Splitter("6;50") row += Label(name) row += InputField() convert_inner += row result_row = Splitter("6;50") result_row += Label("[bold 214]Result") result_row += Label() fade_widget(root) fields = [row[1] for row in convert_inner] focused = fields[0] focused.focus() convert_root.center() convert_root.print() while True: key = getch() if key == keys.TAB: focused.blur() focused = fields[len(fields) - fields.index(focused) - 1] focused.focus() elif key == keys.RETURN: value = focused.clear_value() if not value.isdigit() or int(value) == 0: return # USD -> BEZO if focused == fields[0]: converted = int(value) / (bezo * 10**6) text = f"[249]${value} converts to B{simplify_float(converted):,}!" # BEZO -> USD elif focused == fields[1]: converted = bezo * int(value) * 10**6 text = f"[249]B{value} converts to ${simplify_float(converted):,}!" focused.blur() result_row[1].value = text convert_inner += result_row convert_root.print() getch() focused.focus() convert_root.wipe() convert_inner.pop(-1) elif key == keys.ESC: break else: focused.send(key) convert_root.print() fade_widget(root, True)
def random_rgb() -> tuple[int, int, int]: """Get random rgb color""" return ";".join(random_255() for _ in range(3)) def random_hex() -> str: """Get random hex color""" rgb = tuple(int(color) for color in random_rgb().split(";")) return "#" + "%02x%02x%02x" % rgb # set up styles border_markup = MarkupFormatter("[bold 60]{item}") Container.set_style("border", border_markup) Container.set_style("corner", border_markup) Splitter.set_style("separator", border_markup) Splitter.set_char("separator", boxes.SINGLE.borders[0]) boxes.SINGLE.set_chars_of(Container) # create root Container root = Container() + Prompt("[222 bold]hello", "[72]world") boxes.DOUBLE_TOP.set_chars_of(root) # create inner Container, add elements to it inner = Container() inner += Label("This is an inner [italic bold 24]label") inner += Label( "All [208]widgets[/fg] support [bold @61 141]markup", )
from pytermgui import Label, Container, boxes art = """\ [bold 157] ____ [60] _____ [210] ____ _ _ ___ [/] [bold 157]| _ \ _ [60]|_ _|__ _ __ _ __ ___ [210] / ___| | | |_ _|[/] [bold 157]| |_) | | | |[60]| |/ _ \ '__| '_ ` _ .[210]| | _| | | || | [/] [bold 157]| __/| |_| |[60]| | __/ | | | | | | [210]| |_| | |_| || | [/] [bold 157]|_| \__, |[60]|_|\___|_| |_| |_| |_|[210]\____|\___/|___|[/] ====== [bold 157]|___/[/fg] ======================================= [/] """ Container.set_char("border", [""] * 4) root = Container() for line in art.splitlines(): root += Label(line) root.center() root.print()
"""Style function for values""" return color(item, 33 + 36 * depth) # type: ignore def highlight_style(depth: int, item: str) -> str: """Style function for highlighted elements""" return highlight(item, 99) delimiter_style = create_style(225) padding_label = Label() with alt_buffer(): Container.set_char("border", ["|| ", "~", " ||", "~"]) Label.set_style("value", value_style) Prompt.set_style("value", value_style) Prompt.set_style("label", delimiter_style) Prompt.set_style("delimiter", delimiter_style) Prompt.set_style("highlight", highlight_style) ListView.set_style("highlight", highlight_style) ListView.set_style("options", value_style) ListView.set_style("delimiter", delimiter_style) ProgressBar.set_style("fill", delimiter_style) ProgressBar.set_style("delimiter", value_style)