API design¶
Toga’s API is structured around the following principles:
Coding style¶
The public API follows a “Pythonic” style, using Python language idioms (e.g., context
managers and iterators) and naming conventions (e.g., snake_case
, not
CamelCase
), even if the underlying platforms don’t lean that way.
Names are spelled according to US English.
Properties¶
Wherever possible, Toga exposes an object’s state using property notation (e.g.
widget.property
) rather than getter or setter methods.
Properties follow Postel’s Law
– for example, a widget’s text
property will accept any object when set, but will
always return a string when when retrieved.
Constructors¶
Any of a class’s writable properties can be initialized in its constructor by passing
keyword arguments with the same names. The constructor may also accept read-only
properties such as Widget.id
, which cannot be changed later.
If a constructor has a single required argument, such as the text of a Label
, it
may be passed as a positional argument.
Events¶
Events are used to notify your app of user actions. To make your app handle an event,
you can assign either a regular or async callable to an event handler property. These
can be identified by their names, which always begin with on_
.
Events are named for the general purpose of the interaction, not the specific mechanism.
For example, a Button
’s event is called on_press
, not on_click
, because
“click” implies a mouse is used.
When the event occurs, your handler will be passed the widget as a positional argument,
and other event-specific information as keyword arguments. For forward compatibility
with arguments added in the future, handlers should always declare a **kwargs
argument.
If an event is triggered by a change in a property:
The new value of the property will be visible within the event handler.
Setting the property programmatically will also generate an event, unless the property is set to its existing value, in which case whether it generates an event is undefined.
Common names¶
When a widget allows the user to control a simple value (e.g. the str
of a
TextInput
, or the bool
of a Switch
), then its property is called
value
, and the corresponding event is called on_change
.
When a widget has a non-editable caption, (e.g. a Button
or Switch
), then
its property is called text
.
Ranges of numbers are expressed as separate min
and max
properties.