PyInquirerメモ

こんな感じのやつが可能。
Image from Gyazo

Python Package

有名どころで下記の2点

現状

InquirerはWindowsではいくつかつらい不具合あり
(cmd以外でリストが移動できない、全般的に入力後の文字が消せないなど..)
PyInquirerはその様な不具合がなく
Windows Terminal、cmder、cmdなどでも正常に動作する為、
個人敵にPyInquirerをおすすめ

PyInquirer基本的な使い方

基本的にはInquirer、PyInquirerのどちらも
node.jsのInquirerを参考にしている為、似たような書き方で実現可能。

なぜかPyInquirer公式のexamplesがエラー出る為、実際の動きとサンプルを記載。

Yes/No形式

~ですか?などbool値で分岐等に
Image from Gyazo

# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import generators
from __future__ import division
from PyInquirer import prompt

question_description = [
    {
        "type": "confirm",
        "message": "CLIの対話PyInquirerの紹介を見ますか?",
        "name": "is_description",
        "defalut": True
    },
    {
        "type": "confirm",
        "message": "本当にみますか?",
        "name": "is_description",
        "defalut": False,
        "when": lambda answers: answers["is_description"]
    }
]
answers = prompt(question_description)
print(answers)

テキスト入力形式

デフォルト値なども追加可能。
内容が日本語などだとCUIによってはUnicodeエスケープ表示になるやも

Image from Gyazo

# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import generators
from __future__ import division
from PyInquirer import prompt

questions_text = [
    {
        "name": "question_1",
        "type": "input",
        "message": "質問1",
        "default": "デフォルトの値",
    },
    {
        "name": "question_2",
        "type": "input",
        "message": "質問2",
        "default": "デフォルトの値",
    },
]
answers = prompt(questions_text)
print(answers)

リスト

一定の選択項目から選択
ただのリストで渡しているだけなので、自動生成した選択項目など入れやすい
Image from Gyazo

# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import generators
from __future__ import division
from PyInquirer import prompt

question_list = ["sample_01", "sample_02", "sample_03"]
questions_list = [
    {
        "type": "list",
        "message": "リスト表示",
        "name": "language",
        "choices": question_list
    },
]
answers = prompt(questions_list)
print(answers)

チェックリスト

Spaceでチェック、
(ショートカットAでトグル、Iで反転)
Image from Gyazo

# -*- coding: utf-8 -*-
from __future__ import print_function
from __future__ import unicode_literals
from __future__ import absolute_import
from __future__ import generators
from __future__ import division

from pprint import pprint

from PyInquirer import prompt, Separator

questions = [
    {
        "type": "checkbox",
        "message": "チェックボックスサンプル",
        "name": "check_box_sample",
        "choices": [
            Separator("= separator="),
            {
                "name": "sample_01"
            },
            Separator("= 特殊な操作 ="),
            {
                "name": "sample_02"
            },
            {
                "name": "sample_03"
            },
        ]
    }
]
answers = prompt(questions)
print(answers)

Tips

whenによる組み合わせ

一つ前の以前の質問がTrueなら質問を続行したり質問、リスト等と混ぜることができる。
答えが辞書で返ってくるので、自前で分岐等も可能ですが、
一式質問等でまとめたりなどが可能。

Image from Gyazo

from PyInquirer import prompt

question_list = ["sample_01", "sample_02", "sample_03"]
question_description = [
    {
        "type": "confirm",
        "message": "CLIの対話PyInquirerの紹介を見ますか?",
        "name": "is_description",
        "defalut": True
    },
    {
        "type": "list",
        "message": "リスト表示",
        "name": "language",
        "choices": question_list,
        "when": lambda answers: answers["is_description"]
    },
]
answers = prompt(question_description)
print(answers)