Overview#
app-model
is a declarative, backend-agnostic schema for a GUI-based application.
The primary goal of this library is to provide a set of types that enable an application developer to declare the commands, keybindings, macros, etc. that make up their application.
Installation#
Install from pip
pip install app-model
Or from conda-forge
conda install -c conda-forge app-model
Usage#
See the Getting Started guide for a quick introduction to
app-model
. See the API Reference for a complete
reference of the types and functions provided by app-model
.
Motivation#
Why bother with a declarative application model?
-
It's easier to query the application's state
If you want to ask "what commands are available in this application?", or "what items are currently in a given menu", you can directly query the application registries. For example, you don't need to find a specific
QMenu
instance and iterate itsactions()
to know whether a given item is present. -
It's easier to modify the application's state
For applications that need to be dynamic (e.g. adding and removing menu items and actions as plugins are loaded and unloaded), it is convenient to have an application model that emits events when modified, with the "view" (the actual GUI framework) responding to those events to update the actual presentation.
-
It decouples the structure of the application from the GUI framework
This makes it easier to change the GUI framework without having to change the application. (Obviously, as an application grows with a particular framework, it does become harder to extract, but having a loosely coupled model is a step in the right direction)
-
It's easier to test
app-model
itself is comprehensively tested. By avoiding a number of one-off procedurally created menus, we can test reusable patterns of command/menu/keybinding creation and registration.
GUI Frameworks#
app-model
is framework-agnostic, and can be used with any GUI toolkit, but
Qt is currently the primary target, and a
Qt adapter comes with this library.
See some details in the qt section of the getting started guide.
Example Application#
For a working example of a QApplication built with and without app-model
,
compare
demo/model_app.py
to
demo/qapplication.py
in the demo
directory of the app-model
repository.