.. _dialogs:
Dialogs
=======
Prompt_toolkit ships with a high level API for displaying dialogs, similar to
the Whiptail program, but in pure Python.
Message box
-----------
Use the :func:`~prompt_toolkit.shortcuts.message_dialog` function to display a
simple message box. For instance:
.. code:: python
from prompt_toolkit.shortcuts import message_dialog
message_dialog(
title='Example dialog window',
text='Do you want to continue?\nPress ENTER to quit.').run()
.. image:: ../images/dialogs/messagebox.png
Input box
---------
The :func:`~prompt_toolkit.shortcuts.input_dialog` function can display an
input box. It will return the user input as a string.
.. code:: python
from prompt_toolkit.shortcuts import input_dialog
text = input_dialog(
title='Input dialog example',
text='Please type your name:').run()
.. image:: ../images/dialogs/inputbox.png
The ``password=True`` option can be passed to the
:func:`~prompt_toolkit.shortcuts.input_dialog` function to turn this into a
password input box.
Yes/No confirmation dialog
--------------------------
The :func:`~prompt_toolkit.shortcuts.yes_no_dialog` function displays a yes/no
confirmation dialog. It will return a boolean according to the selection.
.. code:: python
from prompt_toolkit.shortcuts import yes_no_dialog
result = yes_no_dialog(
title='Yes/No dialog example',
text='Do you want to confirm?').run()
.. image:: ../images/dialogs/confirm.png
Button dialog
-------------
The :func:`~prompt_toolkit.shortcuts.button_dialog` function displays a dialog
with choices offered as buttons. Buttons are indicated as a list of tuples,
each providing the label (first) and return value if clicked (second).
.. code:: python
from prompt_toolkit.shortcuts import button_dialog
result = button_dialog(
title='Button dialog example',
text='Do you want to confirm?',
buttons=[
('Yes', True),
('No', False),
('Maybe...', None)
],
).run()
.. image:: ../images/dialogs/button.png
Radio list dialog
-----------------
The :func:`~prompt_toolkit.shortcuts.radiolist_dialog` function displays a dialog
with choices offered as a radio list. The values are provided as a list of tuples,
each providing the return value (first element) and the displayed value (second element).
.. code:: python
from prompt_toolkit.shortcuts import radiolist_dialog
result = radiolist_dialog(
title="RadioList dialog",
text="Which breakfast would you like ?",
values=[
("breakfast1", "Eggs and beacon"),
("breakfast2", "French breakfast"),
("breakfast3", "Equestrian breakfast")
]
).run()
Checkbox list dialog
--------------------
The :func:`~prompt_toolkit.shortcuts.checkboxlist_dialog` has the same usage and purpose than the Radiolist dialog, but allows several values to be selected and therefore returned.
.. code:: python
from prompt_toolkit.shortcuts import checkboxlist_dialog
results_array = checkboxlist_dialog(
title="CheckboxList dialog",
text="What would you like in your breakfast ?",
values=[
("eggs", "Eggs"),
("bacon", "Bacon"),
("croissants", "20 Croissants"),
("daily", "The breakfast of the day")
]
).run()
Styling of dialogs
------------------
A custom :class:`~prompt_toolkit.styles.Style` instance can be passed to all
dialogs to override the default style. Also, text can be styled by passing an
:class:`~prompt_toolkit.formatted_text.HTML` object.
.. code:: python
from prompt_toolkit.formatted_text import HTML
from prompt_toolkit.shortcuts import message_dialog
from prompt_toolkit.styles import Style
example_style = Style.from_dict({
'dialog': 'bg:#88ff88',
'dialog frame.label': 'bg:#ffffff #000000',
'dialog.body': 'bg:#000000 #00ff00',
'dialog shadow': 'bg:#00aa00',
})
message_dialog(
title=HTML(' '
' window'),
text='Do you want to continue?\nPress ENTER to quit.',
style=example_style).run()
.. image:: ../images/dialogs/styled.png
Styling reference sheet
-----------------------
In reality, the shortcut commands presented above build a full-screen frame by using a list of components. The two tables below allow you to get the classnames available for each shortcut, therefore you will be able to provide a custom style for every element that is displayed, using the method provided above.
.. note:: All the shortcuts use the ``Dialog`` component, therefore it isn't specified explicitly below.
+--------------------------+-------------------------+
| Shortcut | Components used |
+==========================+=========================+
| ``yes_no_dialog`` | - ``Label`` |
| | - ``Button`` (x2) |
+--------------------------+-------------------------+
| ``button_dialog`` | - ``Label`` |
| | - ``Button`` |
+--------------------------+-------------------------+
| ``input_dialog`` | - ``TextArea`` |
| | - ``Button`` (x2) |
+--------------------------+-------------------------+
| ``message_dialog`` | - ``Label`` |
| | - ``Button`` |
+--------------------------+-------------------------+
| ``radiolist_dialog`` | - ``Label`` |
| | - ``RadioList`` |
| | - ``Button`` (x2) |
+--------------------------+-------------------------+
| ``checkboxlist_dialog`` | - ``Label`` |
| | - ``CheckboxList`` |
| | - ``Button`` (x2) |
+--------------------------+-------------------------+
| ``progress_dialog`` | - ``Label`` |
| | - ``TextArea`` (locked) |
| | - ``ProgressBar`` |
+--------------------------+-------------------------+
+----------------+-----------------------------+
| Components | Available classnames |
+================+=============================+
| Dialog | - ``dialog`` |
| | - ``dialog.body`` |
+----------------+-----------------------------+
| TextArea | - ``text-area`` |
| | - ``text-area.prompt`` |
+----------------+-----------------------------+
| Label | - ``label`` |
+----------------+-----------------------------+
| Button | - ``button`` |
| | - ``button.focused`` |
| | - ``button.arrow`` |
| | - ``button.text`` |
+----------------+-----------------------------+
| Frame | - ``frame`` |
| | - ``frame.border`` |
| | - ``frame.label`` |
+----------------+-----------------------------+
| Shadow | - ``shadow`` |
+----------------+-----------------------------+
| RadioList | - ``radio-list`` |
| | - ``radio`` |
| | - ``radio-checked`` |
| | - ``radio-selected`` |
+----------------+-----------------------------+
| CheckboxList | - ``checkbox-list`` |
| | - ``checkbox`` |
| | - ``checkbox-checked`` |
| | - ``checkbox-selected`` |
+----------------+-----------------------------+
| VerticalLine | - ``line`` |
| | - ``vertical-line`` |
+----------------+-----------------------------+
| HorizontalLine | - ``line`` |
| | - ``horizontal-line`` |
+----------------+-----------------------------+
| ProgressBar | - ``progress-bar`` |
| | - ``progress-bar.used`` |
+----------------+-----------------------------+
Example
_______
Let's customize the example of the ``checkboxlist_dialog``.
It uses 2 ``Button``, a ``CheckboxList`` and a ``Label``, packed inside a ``Dialog``.
Therefore we can customize each of these elements separately, using for instance:
.. code:: python
from prompt_toolkit.shortcuts import checkboxlist_dialog
from prompt_toolkit.styles import Style
results = checkboxlist_dialog(
title="CheckboxList dialog",
text="What would you like in your breakfast ?",
values=[
("eggs", "Eggs"),
("bacon", "Bacon"),
("croissants", "20 Croissants"),
("daily", "The breakfast of the day")
],
style=Style.from_dict({
'dialog': 'bg:#cdbbb3',
'button': 'bg:#bf99a4',
'checkbox': '#e8612c',
'dialog.body': 'bg:#a9cfd0',
'dialog shadow': 'bg:#c98982',
'frame.label': '#fcaca3',
'dialog.body label': '#fd8bb6',
})
).run()