Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Create Python CLI with select interface

Tags:

I'd like to create a Python CLI with an item selection interface that allows users to choose an item from a list. Something like:

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

I'd like users to be able to change their selection using the up/down arrows and press Enter to confirm.

Does a Python module exist with this functionality? I tried searching but couldn't find exactly what I wanted.

The select-shell Node.js package does exactly what I want.

The pick Python module does what I want, but it uses curses and opens up a simple GUI. I would like to avoid creating a GUI and keep all output in the terminal: this likely requires updating lines displayed to the terminal.

I'm currently using click but I don't believe it supports this functionality. I'm not sure how exactly to input this sort of feature using cmd/readline and would appreciate any insight.

like image 869
Dan Zheng Avatar asked Jul 10 '17 22:07

Dan Zheng


People also ask

Is Python CLI or GUI?

Python is usually regarded as a glue code language, because of it's flexibility and works well with existing programs. Most Python codes are written as scripts and command-line interfaces (CLI).

How do you code Python from command line?

To run Python scripts with the python command, you need to open a command-line and type in the word python , or python3 if you have both versions, followed by the path to your script, just like this: $ python3 hello.py Hello World!


2 Answers

After a bit of searching, I found two libraries that met my needs!

The first is python-inquirer, a Python port of Inquirer.js, a CLI library used by projects like Yeoman. I found this library to have a really nice API (built on top of blessings) but lacks polish when it comes to design/features.

The second (which I will be using) is whaaaaat, another Python port of Inquirer. This library offers functionality much closer to the original Inquirer.js and is exactly what I needed. The API is less clean than that of python-inquirer, however.

Examples:

python-inquirer example:

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 example:

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) 
like image 108
Dan Zheng Avatar answered Oct 08 '22 06:10

Dan Zheng


For simple choices you can use the simple-term-menu package. It is simple, small and has no dependencies to other packages.

Example:

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

simple-term-menu

like image 31
IngoMeyer Avatar answered Oct 08 '22 06:10

IngoMeyer