File: Auto_update_TabularEditor_demo.py

package info (click to toggle)
python-traitsui 8.0.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 18,232 kB
  • sloc: python: 58,982; makefile: 113
file content (123 lines) | stat: -rw-r--r-- 3,522 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# (C) Copyright 2004-2023 Enthought, Inc., Austin, TX
# All rights reserved.
#
# This software is provided without warranty under the terms of the BSD
# license included in LICENSE.txt and may be redistributed only under
# the conditions described in the aforementioned license. The license
# is also available online at http://www.enthought.com/licenses/BSD.txt
#
# Thanks for using Enthought open source!

"""
**WARNING**

  This demo might not work as expected and some documented features might be
  missing.

-------------------------------------------------------------------------------

Auto-update from a list to a TabularEditor

Demonstrates using a TabularEditor with the 'auto_update' feature enabled,
which allows the tabular editor to automatically update itself when the content
of any object in the list associated with the editor is modified.

To interact with the demo:

- Select an employee from the list.
- Adjust their salary increase.
- Click the **Give raise** button.
- Observe that the table automatically updates to reflect the employees new
  salary.

In order for auto-update to work correctly, the editor trait should be a list
of objects derived from HasTraits. Also, performance can be affected when very
long lists are used, since enabling this feature adds and removed Traits
listeners to each item in the list.

"""
# Issues related to the demo warning:
# enthought/traitsui#960

from traits.api import HasTraits, Str, Float, List, Instance, Button
from traitsui.api import (
    View,
    HGroup,
    Item,
    TabularAdapter,
    TabularEditor,
    spring,
)


# -- EmployeeAdapter Class ------------------------------------------------
class EmployeeAdapter(TabularAdapter):

    columns = [('Name', 'name'), ('Salary', 'salary')]

    def get_default_value(self, object, trait):
        return Employee(name="John", salary=30000)


# -- Employee Class -------------------------------------------------------
class Employee(HasTraits):

    name = Str()
    salary = Float()


# -- Company Class --------------------------------------------------------
class Company(HasTraits):

    employees = List(Employee)
    employee = Instance(Employee)
    increase = Float()
    give_raise = Button('Give raise')

    traits_view = View(
        Item(
            'employees',
            show_label=False,
            editor=TabularEditor(
                adapter=EmployeeAdapter(),
                selected='employee',
                auto_resize=True,
                auto_update=True,
            ),
        ),
        HGroup(
            spring,
            Item('increase'),
            Item(
                'give_raise',
                show_label=False,
                enabled_when='employee is not None',
            ),
        ),
        title='Auto Update Tabular Editor demo',
        height=0.25,
        width=0.30,
        resizable=True,
    )

    def _give_raise_changed(self):
        self.employee.salary += self.increase
        self.employee = None


# -- Set up the demo ------------------------------------------------------
demo = Company(
    increase=1000,
    employees=[
        Employee(name='Fred', salary=45000),
        Employee(name='Sally', salary=52000),
        Employee(name='Jim', salary=39000),
        Employee(name='Helen', salary=41000),
        Employee(name='George', salary=49000),
        Employee(name='Betty', salary=46000),
    ],
)

# Run the demo (if invoked from the command line):
if __name__ == '__main__':
    demo.configure_traits()