Forever Scalable
Quo is a toolkit for writing Command-Line Interface(CLI) applications and a TUI (Text User Interface) framework for Python.
Quo is making headway towards composing speedy and orderly CLI and TUI applications while forestalling any disappointments brought about by the failure to execute a python application. Simple to code, easy to learn, and does not come with needless baggage.
Quo works flawlessly with Linux, OSX, and Windows.
Quo requires Python 3.8
or later.
- Support for Ansi, RGB and Hex color models
- Support for tabular presentation of data
- Intuitive progressbars
- Code completions
- Nesting of commands
- Customizable Text User Interface (TUI) dialogs.
- Automatic help page generation
- Syntax highlighting
- Autosuggestions
- Key Binders
You can install quo via the Python Package Index (PyPI)
pip install -U quo
In order to check your installation you can use
python -m pip show quo
Run the following to test Quo output on your terminal:
python -m quo
💡 press Ctrl-c
to exit
Quo contains a number of builtin features you c an use to create elegant output in your CLI.
To output formatted text to your terminal you can import the echo method. Try this:
Example 1
from quo import echo
echo("Hello, World!", fg="red", italic=True, bold=True)
Example 2
from quo import echo
echo("Blue on white", fg="blue", bg="white")
Alternatively, you can import print
Example 1
from quo import print
print('<b>This is bold</b>')
print('<i>This is italic</i>')
Example 2
from quo import print
print('<u>This is underlined</u>')
Example 3
from quo import print
print("Quo is <style bg='red'>Scalable</style>")
Example 4
# Colors from the ANSI palette.
print('<red>This is red</red>')
print('<style fg="white" bg="green">White on green</stlye>')
- Using
quo.prompt
method.
from quo.prompt import prompt
prompt("What is your name?")
- Using
quo.prompt.Prompt
object
Example 1
from quo.prompt import Prompt
session = Prompt()
session.prompt("Type something:")
Example 2 Colored Prompt
from quo.prompt import Prompt
session = Prompt()
session.prompt("<red>Type something: </red>")
Example 3 Example upgrade
from quo.prompt import Prompt
session = Prompt(fg="blue") #The input will be colored blue
session.prompt("<red>john</red><white>@</white><green>localhost</green><red>:</red><cyan><u>/user/john</u></cyan><purple>$ </purple>")
Example 4 Bottom toolbar
from quo.prompt import Prompt
session = Prompt()
session.prompt('> ', bottom_toolbar="<i>This is a</i><b><style bg='red'> Toolbar</style></b>")
Example 5
Here's an example of a multiline bottom toolbar.
from quo.prompt import Prompt
session = Prompt()
session.prompt("Say something: ", bottom_toolbar="This is\na multiline toolbar")
Example 6
Placeholder text
A placeholder text that's displayed as long as no input s given.
💡 This won't be returned as part of the output.
from quo.prompt import Prompt
session = Prompt()
session.prompt("What is your name?: ", placeholder='<gray>(please type something)</gray>')
Example 7
Coloring the prompt.
from quo.prompt import Prompt
session = Prompt(fg="red")
session.prompt("Type something: ")
Example 8
Autocomplete text
Press [Tab] to autocomplete
from quo.prompt import Prompt
from quo.completion import WordCompleter
example = WordCompleter(['USA', 'UK', 'Canada', 'Kenya'])
session = Prompt(completer=example)
session.prompt('Which country are you from?: ')
Example 9
Autosuggest text
Auto suggestion is a way to propose some input completions to the user. Usually, the input is compared to the history and when there is another entry starting with the given text, the completion will be shown as gray text behind the current input. Pressing the right arrow → or ctrl-e will insert this suggestion, alt-f will insert the first word of the suggestion.
from quo.history import MemoryHistory
from quo.prompt import Prompt
MemoryHistory.append("import os")
MemoryHistory.append('print("hello")')
MemoryHistory.append('print("world")')
MemoryHistory.append("import path")
session = Prompt(history=MemoryHistory, suggest="history")
while True:
session.prompt('> ')
Read more on Prompt
Draw a horizontal bar with an optional title, which is a good way of dividing your terminal output in to sections.
from quo.bar import Bar
bar = Bar("I am a bar")
bar.draw()
- Styled bar
from quo.bar import Bar
bar = Bar("I am a styled bar")
bar.draw(fg="blue", bg="yellow")
- Right aligned
from quo.bar import Bar
bar = Bar("I am right aligned")
bar.draw(align="right")
For more control over quo terminal content, import and construct a Console
object.
Launching Applications
Quo supports launching applications through Console.launch
Example 1
from quo.console import Console
console = Console()
console.launch("https://quo.rtfd.io/")
Example 2
from quo.console import Console
console = Console()
console.launch("/home/path/README.md", locate=True)
Spin
🔁
Quo can create a context manager that is used to display a spinner on stdout as long as the context has not exited
import time
from quo.console import Console
console = Console()
with console.spin():
time.sleep(3)
print("Hello, World")
Read more on Console
High level API for displaying dialog boxes to the user for informational purposes, or to get input from the user.
Example 1
Message Box dialog
from quo.dialog import MessageBox
MessageBox(
title='Message window',
text='Do you want to continue?\nPress ENTER to quit.')
Example 2
- Input dialog
from quo.dialog import InputBox
InputBox(
title='PromptBox Shenanigans',
text='What Country are you from?:')
- Multiline Input dialog
from quo.dialog import InputBox
InputBox(
title='PromptBox Shenanigans',
text='What Country are you from?:',
multiline=True)
- Password Input dialog
from quo.dialog import InputBox
InputBox(
title='PromptBox Shenanigans',
text='What Country are you from?:',
hide=True)
- Radiolist
from quo.dialog import RadiolistBox
RadiolistBox(
title="RadioList dialog example",
text="Which breakfast would you like ?",
values=[
("breakfast1", "Eggs and beacon"),
("breakfast2", "French breakfast"),
("breakfast3", "Equestrian breakfast")
])
Read more on Dialogs
A key binding is an association between a physical key on akeyboard and a parameter.
from quo import echo
from quo.keys import bind
from quo.prompt import Prompt
session = Prompt()
# Print "Hello world" when ctrl-h is pressed
@bind.add("ctrl-h")
def _(event):
echo("Hello, World!")
session.prompt("")
Read more on Key bindings
You can parse optional and positional arguments with Quo and generate help pages for your command-line tools.
from quo.parse import Parser
parser = Parser(description= "This script prints hello NAME COUNT times.")
parser.argument('--count', default=3, type=int, help='number of greetings')
parser.argument('name', help="The person to greet")
arg = parser.parse()
for x in range(arg.count):
print(f"Hello {arg.name}!")
$ python prog.py John --count 4
And what it looks like:
Here's what the help page looks like:
$ python prog.py --help
Read more on Parser
Creating a new progress bar can be done by calling the class ProgressBar
The progress can be displayed for any iterable. This works by wrapping the iterable (like range
) with the class ProgressBar
import time
from quo.progress import ProgressBar
with ProgressBar() as pb:
for i in pb(range(800)):
time.sleep(.01)
Read more on Progress
Used for drawing a horizontal line.
Example 1
from quo.rule import Rule
rule = Rule()
rule.draw()
Example 2
- A styled line.
from quo.rule import Rule
rule = Rule()
rule.draw(color="purple")
Example 3
- A multicolored line.
from quo.rule import Rule
rule = Rule()
rule.draw(multicolored=True)
This offers a number of configuration options to set the look and feel of the table, including how borders are rendered and the style and alignment of the columns.
Example 1
from quo.table import Table
data = [
["Name", "Gender", "Age"],
["Alice", "F", 24],
["Bob", "M", 19],
["Dave", "M", 24]
]
table = Table(data)
table.print()
Example 2
Right aligned table
from quo.table import Table
data = [
["Name", "Gender", "Age"],
["Alice", "F", 24],
["Bob", "M", 19],
["Dave", "M", 24]
]
table = Table(data)
table.print(align="right")
Example 3
Colored table
from quo.table import Table
data = [
["Name", "Gender", "Age"],
["Alice", "F", 24],
["Bob", "M", 19],
["Dave", "M", 24]
]
table = Table(data)
table.print(fg="green")
Example 4
Column width
In situations where fields are expected to reasonably be too long to look good as a single line, parameter column_width
can help automate word wrapping long fields.
from quo.table import Table
data = [
[1, 'John Smith', 'This is a rather long description that might look better if it is wrapped a bit']
]
table = Table(data)
table.print(headers=("Issue Id", "Author", "Description"), column_width=[None, None, 30])
Example 5
Grid table
from quo.table import Table
data = [
["Name", "Gender", "Age"],
["Alice", "F", 24],
["Bob", "M", 19],
["Dave", "M", 24]
]
table = Table(data)
table.print(theme="grid")
Read more on Table
A collection of reusable components for building full screen applications.
Used draw a border around any container, optionally with a title.
Read more on Frame
Widget that displays text.
Read more on Label
from quo import container
from quo.box import Box
from quo.label import Label
content = Label("Hello, World!", fg='red', bg='yellow')
container(content)
Read more on Widgets
For more intricate examples, have a look in the examples directory and the documentation.
In order to for us to maintain this project and grow our community of contributors. Donate
Simple If you know Python you can easily use quo and it can integrate with just about anything.
For discussions about the usage, development, and the future of quo, please join our Google community
If you have any suggestions, bug reports, or annoyances please report them to our issue tracker at Bug tracker or send an email to:
📥 scalabli@googlegroups.com | scalabli@proton.me
→ How to build CLIs using quo
This software is licensed under the MIT License
. See the License file in the top distribution directory for the full license text.
Code of Conduct is adapted from the Contributor Covenant, version 1.2.0 available at Code of Conduct