File: Table_editor_with_checkbox_column.py

package info (click to toggle)
python-traitsui 4.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 13,292 kB
  • sloc: python: 39,867; makefile: 120; sh: 5
file content (121 lines) | stat: -rw-r--r-- 3,760 bytes parent folder | download
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
#  Copyright (c) 2007, Enthought, Inc.
#  License: BSD Style.

"""
This shows a table editor which has a checkbox column in addition to normal
data columns.
"""

# Imports:
from random \
    import randint

from traits.api \
    import HasStrictTraits, Str, Int, Float, List, Bool, Property

from traitsui.api \
    import View, Item, TableEditor

from traitsui.table_column \
    import ObjectColumn

from traitsui.extras.checkbox_column \
    import CheckboxColumn


# Create a specialized column to set the text color differently based upon
# whether or not the player is in the lineup:
class PlayerColumn ( ObjectColumn ):

    # Override some default settings for the column:
    width                = 0.08
    horizontal_alignment = 'center'

    def get_text_color ( self, object ):
        return [ 'light grey', 'black' ][ object.in_lineup ]


# The 'players' trait table editor:
player_editor = TableEditor(
    sortable     = False,
    configurable = False,
    auto_size    = False,
    columns  = [ CheckboxColumn( name  = 'in_lineup',  label = 'In Lineup',
                                 width = 0.12 ),
                 PlayerColumn( name = 'name', editable = False, width  = 0.24,
                               horizontal_alignment = 'left' ),
                 PlayerColumn( name   = 'at_bats',     label  = 'AB' ),
                 PlayerColumn( name   = 'strike_outs', label  = 'SO' ),
                 PlayerColumn( name   = 'singles',     label  = 'S' ),
                 PlayerColumn( name   = 'doubles',     label  = 'D' ),
                 PlayerColumn( name   = 'triples',     label  = 'T' ),
                 PlayerColumn( name   = 'home_runs',   label  = 'HR' ),
                 PlayerColumn( name   = 'walks',       label  = 'W' ),
                 PlayerColumn( name   =  'average',    label  = 'Ave',
                               editable = False,       format = '%0.3f' ) ] )

# 'Player' class:
class Player ( HasStrictTraits ):

    # Trait definitions:
    in_lineup   = Bool( True )
    name        = Str
    at_bats     = Int
    strike_outs = Int
    singles     = Int
    doubles     = Int
    triples     = Int
    home_runs   = Int
    walks       = Int
    average     = Property( Float )

    def _get_average ( self ):
        """ Computes the player's batting average from the current statistics.
        """
        if self.at_bats == 0:
            return 0.0

        return float( self.singles + self.doubles +
                      self.triples + self.home_runs ) / self.at_bats


class Team ( HasStrictTraits ):

    # Trait definitions:
    players = List( Player )

    # Trait view definitions:
    traits_view = View(
        Item( 'players',
              show_label = False,
              editor     = player_editor
        ),
        title     = 'Baseball Team Roster Demo',
        width     = 0.5,
        height    = 0.5,
        resizable = True
    )


def random_player ( name ):
    """ Generates and returns a random player.
    """
    p = Player( name        = name,
                strike_outs = randint( 0, 50 ),
                singles     = randint( 0, 50 ),
                doubles     = randint( 0, 20 ),
                triples     = randint( 0,  5 ),
                home_runs   = randint( 0, 30 ),
                walks       = randint( 0, 50 ) )
    return p.trait_set( at_bats = p.strike_outs + p.singles + p.doubles + p.triples +
                            p.home_runs + randint( 100, 200 ) )

# Create the demo:
demo = view = Team( players = [ random_player( name ) for name in [
    'Dave', 'Mike', 'Joe', 'Tom', 'Dick', 'Harry', 'Dirk', 'Fields', 'Stretch'
] ] )

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