A minimal access to GUI, TUI, CLI and config
Project description
Mininterface – access to GUI, TUI, CLI and config files
Write the program core, do not bother with the input/output.
Check out the code, which is surprisingly short, that displays such a window or its textual fallback.
from dataclasses import dataclass
from mininterface import run
@dataclass
class Env:
""" This calculates something. """
my_flag: bool = False
""" This switches the functionality """
my_number: int = 4
""" This number is very important """
if __name__ == "__main__":
env = run(Env, prog="My application").env
# Attributes are suggested by the IDE
# along with the hint text 'This number is very important'.
print(env.my_number)
Contents
You got CLI
It was all the code you need. No lengthy blocks of code imposed by an external dependency. Besides the GUI/TUI, you receive powerful YAML-configurable CLI parsing.
$ ./hello.py
usage: My application [-h] [--test | --no-test] [--important-number INT]
This calculates something.
╭─ options ──────────────────────────────────────────────────────────╮
│ -h, --help show this help message and exit │
│ --test, --no-test My testing flag (default: False) │
│ --important-number INT This number is very important (default: 4) │
╰────────────────────────────────────────────────────────────────────╯
You got config file management
Loading config file is a piece of cake. Alongside program.py
, put program.yaml
and put there some of the arguments. They are seamlessly taken as defaults.
my_number: 555
You got dialogues
Check out several useful methods to handle user dialogues. Here we bound the interface to a with
statement that redirects stdout directly to the window.
with run(Env) as m:
print(f"Your important number is {m.env.my_number}")
boolean = m.is_yes("Is that alright?")
Background
Wrapper between the tyro argparse
replacement and tkinter_form that converts dicts into a GUI.
Writing a small and useful program might be a task that takes fifteen minutes. Adding a CLI to specify the parameters is not so much overhead. But building a simple GUI around it? HOURS! Hours spent on researching GUI libraries, wondering why the Python desktop app ecosystem lags so far behind the web world. All you need is a few input fields validated through a clickable window... You do not deserve to add hundred of lines of the code just to define some editable fields. Mininterface
is here to help.
The config variables needed by your program are kept in cozy dataclasses. Write less! The syntax of tyro does not require any overhead (as its argparse
alternatives do). You just annotate a class attribute, append a simple docstring and get a fully functional application:
- Call it as
program.py --help
to display full help. - Use any flag in CLI:
program.py --my-flag
causesenv.my_flag
be set toTrue
. - The main benefit: Launch it without parameters as
program.py
to get a full working window with all the flags ready to be edited. - Running on a remote machine? Automatic regression to the text interface.
Installation
Install with a single command from PyPi.
pip install mininterface
Docs
See the docs overview at https://cz-nic.github.io/mininterface/.
Examples
A complex dataclass.
from typing import Annotated
from dataclasses import dataclass
from mininterface.validators import not_empty
from mininterface import run, Tag, Validation
@dataclass
class NestedEnv:
another_number: int = 7
""" This field is nested """
@dataclass
class Env:
nested_config: NestedEnv
mandatory_str: str
""" As there is not default value, you will be prompted automatically to fill up the field """
my_number: int | None = None
""" This is not just a dummy number, if left empty, it is None. """
my_string: str = "Hello"
""" A dummy string """
my_flag: bool = False
""" Checkbox test """
my_validated: Annotated[str, Validation(not_empty)] = "hello"
""" A validated field """
m = run(Env, title="My program")
# See some values
print(m.env.nested_config.another_number) # 7
print(m.env)
# Env(nested_config=NestedEnv(another_number=7), my_number=5, my_string='Hello', my_flag=False, my_validated='hello')
# Edit values in a dialog
m.form()
Form with paths
We have a dict with some paths. Here is how it looks.
from pathlib import Path
from mininterface import run, Tag
m = run(title="My program")
my_dictionary = {
"paths": Tag("", annotation=list[Path]),
"default_paths": Tag([Path("/tmp"), Path("/usr")], annotation=list[Path])
}
# Edit values in a dialog
m.form(my_dictionary)
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file mininterface-0.6.1.tar.gz
.
File metadata
- Download URL: mininterface-0.6.1.tar.gz
- Upload date:
- Size: 35.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 750f9c025764ea8ec4e6bb5eb14e1928dddaf57ad41449811f123e7a98369708 |
|
MD5 | 083d211c452ad493774ffd62fe198444 |
|
BLAKE2b-256 | 246944b79743fe956fc4eee196b267382ba90ecae215e699135be42df48cb009 |
File details
Details for the file mininterface-0.6.1-py3-none-any.whl
.
File metadata
- Download URL: mininterface-0.6.1-py3-none-any.whl
- Upload date:
- Size: 43.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/4.0.2 CPython/3.11.10
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | a6c144d2477ef031580b2a4626c60e0d0de0d1fa6d0ce594dbc90bfb0a9a774c |
|
MD5 | 2abcda36f6d348a4b1048682f7a0fe37 |
|
BLAKE2b-256 | 021416530c7d6cf7937cbde600411478d7e108ca6f68925b2ae422b3791ef859 |