Создать Python CLI с выбранным интерфейсом

Я хотел бы создать Python CLI с интерфейсом выбора элемента, который позволяет пользователям выбирать элемент из списка. Что-то вроде:

Select a fruit (up/down to select and enter to confirm):
[x] Apple
[ ] Banana
[ ] Orange

Я бы хотел, чтобы пользователи могли менять свой выбор с помощью стрелок вверх / вниз и нажимать Enter подтвердить.

Существует ли модуль Python с этой функциональностью? Я попытался найти, но не смог найти именно то, что хотел.

Пакет select-shell Node.js делает именно то, что я хочу.

Модуль Python pick делает то, что я хочу, но он использует проклятия и открывает простой графический интерфейс. Я хотел бы избежать создания графического интерфейса и сохранить весь вывод в терминале: это, вероятно, требует обновления строк, отображаемых на терминале.

В настоящее время я использую Click, но я не верю, что он поддерживает эту функцию. Я не уверен, как именно для ввода такого рода функции, используя cmd/readline и был бы признателен за любое понимание.

4 ответа

Решение

После небольшого поиска я нашел две библиотеки, которые отвечали моим потребностям!

Первым является python-inquirer, Python-порт Inquirer.js, библиотеки CLI, используемой такими проектами, как Yeoman. Я обнаружил, что у этой библиотеки действительно хороший API (построенный на благословениях), но ей не хватает полировки, когда дело доходит до дизайна / функций.

Второй (который я буду использовать) - это whaaaaat, еще один Python-порт Inquirer. Эта библиотека предлагает функциональность намного ближе к оригинальному Inquirer.js и именно то, что мне нужно. Однако API менее чистый, чем у python-inquirer.

Примеры:

python-inquirer пример:

import os
import sys
import re
sys.path.append(os.path.realpath('.'))
from pprint import pprint

import inquirer

questions = [
    inquirer.List('size',
                  message="What size do you need?",
                  choices=['Jumbo', 'Large', 'Standard', 'Medium', 'Small', 'Micro'],
              ),
]

answers = inquirer.prompt(questions)

pprint(answers)

whaaaaat пример:

from whaaaaat import prompt, print_json, Separator

questions = [
    {
        'type': 'list',
        'name': 'theme',
        'message': 'What do you want to do?',
        'choices': [
            'Order a pizza',
            'Make a reservation',
            Separator(),
            'Ask for opening hours',
            {
                'name': 'Contact support',
                'disabled': 'Unavailable at this time'
            },
            'Talk to the receptionist'
        ]
    },
    {
        'type': 'list',
        'name': 'size',
        'message': 'What size do you need?',
        'choices': ['Jumbo', 'Large', 'Standard', 'Medium', 'Small', 'Micro'],
        'filter': lambda val: val.lower()
    }
]

answers = prompt(questions)
print_json(answers)

Еще несколько альтернатив библиотекам ввода форм командной строки:

Примечание. Я сопровождаю beaupy.

Для простого выбора вы можете использовать пакет simple-term-menu. Он простой, маленький и не зависит от других пакетов.

Пример:

from simple_term_menu import TerminalMenu

terminal_menu = TerminalMenu(["entry 1", "entry 2", "entry 3"])
choice_index = terminal_menu.show()

простое меню

Вы упоминаете пакет щелчка и упоминаете, что не знаете, как реализовать эту функцию. Похоже, что варианты выбора - это предполагаемый способ реализации вопросов с одним выбором.

Сгенерированный вывод будет не таким хорошим, как в некоторых других пакетах, упомянутых в других ответах. Тем не менее, щелчок поддерживается в хорошем состоянии, активен и работает как в UNIX, так и в WIN - критических аргументах, если вы планируете выпустить библиотеку.

Другие вопросы по тегам