欢迎访问宙启技术站
智能推送

使用prompt_toolkit创建具有标签和菜单的命令行应用程序

发布时间:2023-12-23 19:32:50

使用 prompt_toolkit 可以创建具有标签和菜单的命令行应用程序。下面是一个简单的示例,展示了如何创建一个具有两个标签页和一个菜单的应用程序。

from prompt_toolkit import Application
from prompt_toolkit.key_binding import KeyBindings
from prompt_toolkit.layout.containers import HSplit, VSplit
from prompt_toolkit.layout.controls import FormattedTextControl
from prompt_toolkit.layout.layout import Layout
from prompt_toolkit.widgets import Box, Button, Frame, Label, MenuItem, MenuContainer, TextArea, Window
from prompt_toolkit.styles import Style

# 创建应用程序的样式
style = Style.from_dict({
    'menu-bar': 'bg:#aaaaaa #ffffff',
    'menu-item': 'bg:#aaaaaa #000000',
    'selected-menu-item': 'bg:#ff0000 #ffffff',
})

# 创建标签页1的内容
label1_text = 'This is label 1'
label1_c = FormattedTextControl(text=label1_text)
label1 = Label(text=label1_text, style='class:label', width=16)

# 创建标签页2的内容
label2_text = 'This is label 2'
label2_c = FormattedTextControl(text=label2_text)
label2 = Label(text=label2_text, style='class:label', width=16)

# 创建菜单项
menu_items = [
    MenuItem('Option 1', handler=lambda: set_label_text('Option 1 selected')),
    MenuItem('Option 2', handler=lambda: set_label_text('Option 2 selected')),
    MenuItem('Option 3', handler=lambda: set_label_text('Option 3 selected')),
]


def create_menu():
    return MenuContainer(
        body=HSplit([Label(text='Menu:', style='class:label')]),
        menu_items=[
            MenuItem('File', children=[
                MenuItem('Open', handler=lambda: set_label_text('File > Open selected')),
                MenuItem('Save', handler=lambda: set_label_text('File > Save selected')),
            ]),
            MenuItem('Edit', children=[
                MenuItem('Cut', handler=lambda: set_label_text('Edit > Cut selected')),
                MenuItem('Copy', handler=lambda: set_label_text('Edit > Copy selected')),
                MenuItem('Paste', handler=lambda: set_label_text('Edit > Paste selected')),
            ]),
            MenuItem('Options', children=[
                MenuItem('Option 1', handler=lambda: set_label_text('Options > Option 1 selected')),
                MenuItem('Option 2', handler=lambda: set_label_text('Options > Option 2 selected')),
                MenuItem('Option 3', handler=lambda: set_label_text('Options > Option 3 selected')),
            ]),
        ],
        style='class:menu-bar',
    )


# 设置标签页内容
def set_label_text(text):
    label1_c.text = text
    label2_c.text = text


# 创建应用程序布局
def create_layout():
    root_container = HSplit([
        create_menu(),
        VSplit([
            Box(frame=Frame(label1, title='Label 1:', width=20)),
            Box(frame=Frame(label2, title='Label 2:', width=20)),
            Window(width=2, char='|'),
            TextArea(),
        ]),
        Label(text='Press "Control+C" to quit.', style='class:label'),
    ])
    return Layout(root_container)


# 处理按键绑定
bindings = KeyBindings()


@bindings.add('c-c')
def _(event):
    event.app.exit()


# 创建应用程序
app = Application(layout=create_layout(), key_bindings=bindings, full_screen=True, style=style)


# 运行应用程序
def run_app():
    app.run()


if __name__ == '__main__':
    run_app()

这个应用程序创建了一个具有两个标签页("Label 1" 和 "Label 2")和一个菜单的命令行应用程序。标签页的内容可以通过菜单项的选择进行更改。菜单有三个主要类别:文件,编辑和选项,每个类别下有相应的项目。可以通过选择菜单项来更改标签页的内容。

这个例子展示了如何使用 prompt_toolkit 创建具有标签和菜单的命令行应用程序。您可以根据自己的需求进行修改和扩展,以创建更复杂的应用程序。