Traits and TraitsUI =================== Traits is a python package, developed by Enthought, for creating and interacting with statically-typed variables: '**traits**'. To efficiently develop UIs for traits Enthough developed a sister package, TraitsUI. A class that has traits variables as attributes, inherits from ``HasTraits``, so that those variables can be initialized and handled appropriately. Most, if not all, of the classes in the BDSS (and in the Workflow Manager) inherit from ``HasTraits``, therefore before extending BDSS it is useful to have some basic knowledge of Traits and TraitsUI. Full documentation can be found here: `Traits `_ `TraitsUI `_ These provide brief introductions to the packages. Here we provide an even more minimal introduction that should make the code examples in following topics clearer. Traits ------ Traits are class objects (like every variable in python). The more common classes just wrap around a built-in python type, with a class name that is the camel case version of the built-in type. For instance, .. code-block:: python # initialization of a string trait, x. x = Str('hello world') # initialization of a dictionary trait, y. y = Dict({'English':'hello world', 'German':'hallo welt'}) # initialization of a float trait, z, to the default value of 0.0 z = Float() print(z) >> 0.0 Traits are typically initialized within a ``HasTraits`` class, .. code-block:: python class HelloWorld(HasTraits): x = Str('bonjour le monde') ..... The ``HasTraits`` inheritence defines a constructor that takes the traits as arguments. .. code-block:: python my_hello_world = HelloWorld(x='ciao mondo', .....) print(my_hello_world.x) >> ciao mondo If no argument is given for a trait it is initialized to the value (default or otherwise) given within the class declaration, .. code-block:: python my_hello_world = HelloWorld() print(my_hello_world.x) >> bonjour le monde As with any python class member, traits variables are refered to by ``self`` in methods, .. code-block:: python class HelloWorld(HasTraits): x = Str('bonjour le monde') def shout_the_greeting(self): return self.x.upper() my_hello_world = HelloWorld() print(my_hello_world.shout_the_greeting()) >> BONJOUR LE MONDE Almost all classes in the BDSS and the Workflow Manager (including all those in the code examples in the following topics) inherit from ``HasTraits``, usually indirectly through a base class (you won't see ``HasTraits`` in the class declaration). Views ----- TraitsUI provides the UI to traits (as the name suggests!). It provides any ``HasTraits`` object with a default UI that exposes all the traits it contains. Each trait type is associated with a default UI element (text field for a Str, etc.) and TraitsUI lays out these elements automatically in a window or panel. A custom layout, possibly including custom UI elements ('editors'), can be provided by intializing a ``View`` object within the ``TraitsUI`` class, .. code-block:: python class HelloWorld(HasTraits): x = Str('bonjour le monde') y = Int(5) view = View( Item(name='x', label='hello message', editor=HTMLEditor()), Item(name='y', label='number of people listening'), padding=10, resizable=True ) Each trait is associated with an ``Item`` object (itself a ``HasTraits`` class) by assigning the ``Item`` 's ``name`` attribute to the string of the trait variable name. In addition, the ``Item`` constructor has optional arguments that determine what non-default UI elements ('editors'), if any, are used to expose the trait and how they are laid out. The ``Item`` s are assigned to a ``View`` object as * vargs. In addition the ``View`` constructor has a number of optional keyword arguments that determine layout, etc. For layout purposes ``Item`` s can be grouped by assigning them to ``Group`` objects that are then assigned to the ``View``. .. code-block:: python view = View( Group( Item(name='x', label='hello message'), Item(name='y', label='number of people arriving'), label='arriving' ), Group( Item(name='i', label='goodbye message'), Item(name='j', label='number of people departing'), label='departing' ) ) Like for the ``View``, the ``Group`` constructor has a number of keyword arguments that effect layout, labelling, etc. In the following topics, code examples with ``View`` initializations will show the resulting UI alongside.