Package teamwork :: Package widgets :: Module scale
[hide private]
[frames] | no frames]

Source Code for Module teamwork.widgets.scale

  1  from teamwork.math.Interval import * 
  2   
  3  from Tkinter import * 
  4  import Pmw 
  5   
6 -class IntervalScale(Pmw.MegaWidget):
7 """ Megawidget containing a scale, confidence and an indicator. 8 """ 9 confidenceValues = ['lo', 'med', 'hi'] 10
11 - def __init__(self, parent = None, **kw):
12 # Define the megawidget options. 13 optiondefs = ( 14 ('color', 1, None), 15 ('confidence', 1, Pmw.INITOPT), 16 ('orient', 'vertical', Pmw.INITOPT), 17 ('labelmargin', 0, Pmw.INITOPT), 18 ('labelpos', 'w', Pmw.INITOPT), 19 ('text', '', Pmw.INITOPT), 20 ('showvalue', 0, self.showValue), 21 ('threshold', (50,), None), 22 ('value', None, None), 23 ) 24 self.defineoptions(kw, optiondefs) 25 26 # Initialise base class (after defining options). 27 Pmw.MegaWidget.__init__(self, parent) 28 29 # Create the components. 30 interior = self.interior() 31 32 # Create the indicator component. 33 # self.indicator = self.createcomponent('indicator', 34 # (), None, 35 # Frame, interior, 36 # width = 16, 37 # height = 16, 38 # borderwidth = 2, 39 # relief = 'raised') 40 41 ## # Create the value component. 42 ## self.value = self.createcomponent('value', (), None, 43 ## Label, interior, width = 3) 44 self.group = self.createcomponent('Group', (), None, 45 Pmw.Group, interior, 46 tag_text=self['text'], 47 tag_font=('Helvetica',14,'bold')) 48 widget = self.group.component('tag') 49 self.activeFG = widget.cget('activeforeground') 50 self.disabledFG = widget.cget('disabledforeground') 51 # Create the scale component. 52 if self['orient'] == 'vertical': 53 # The default scale range seems to be 54 # the wrong way around - reverse it. 55 from_ = 100 56 to = 0 57 else: 58 from_ = 0 59 to = 100 60 61 # Draw scale widget 62 self.scale = self.createcomponent('scale', 63 (), None, Scale, 64 self.group.interior(), 65 orient = self['orient'], 66 # command = self.__doCommand, 67 ## showvalue = 0, 68 length = 200, 69 from_ = from_, 70 to = to) 71 72 73 if self['orient'] == 'vertical': 74 self.scale.pack(side=LEFT,fill=Y,expand=YES) 75 else: 76 self.scale.pack(side=TOP,fill=X,expand=YES) 77 78 # Frame for any buttons 79 self.buttonFrame = Frame(self.group.interior()) 80 # Draw confidence widget, if applicable 81 if self['confidence']: 82 self.radio = self.createcomponent('radio',(),None, 83 Pmw.OptionMenu, 84 self.buttonFrame, 85 menubutton_width=3, 86 labelpos='w', 87 label_text='Confidence:', 88 items=self.confidenceValues 89 ) 90 self.radio.pack(side=LEFT,fill=Y,expand=YES) 91 ## self.radio = self.createcomponent('radio', 92 ## (), None, Pmw.RadioSelect, 93 ## self.group.interior(), 94 ## buttontype = 'radiobutton', 95 ## labelpos = 'w', 96 ## label_text = 'Confidence:', 97 ## hull_borderwidth = 0, 98 ## hull_relief = 'ridge', 99 ## hull_width = 2, 100 ## frame_width = 2, 101 ## pady = 1, 102 ## padx = 1, 103 ## hull_height = 2, 104 ## frame_height = 2, 105 ## orient = self['orient'], 106 ## # command = self.__doCommand2, 107 ## ) 108 ## for text in self.confidenceValues: 109 ## self.radio.add(text) 110 ## if self['orient'] == 'vertical': 111 ## self.radio.pack(side=LEFT,fill=Y,expand=YES) 112 ## else: 113 ## self.radio.pack(side=TOP,fill=X,expand=YES) 114 else: 115 self.radio = None 116 val = self['value'] 117 self.setter(val) 118 # Check keywords and initialise options. 119 self.initialiseoptions() 120 self.buttonFrame.pack() 121 self.group.pack(side=TOP,fill=X,expand=YES)
122
123 - def showValue(self):
124 """Configures the value visibility on the scale""" 125 self.scale.configure(showvalue=self['showvalue'])
126
127 - def setter(self, val):
128 if val is not None: 129 conf = (val.hi - val.lo) / 2.0 130 state = self.scale.cget('state') 131 if state != NORMAL: 132 self.scale.configure(state=NORMAL) 133 self.scale.set(val.mean()) 134 self.scale.configure(state=state) 135 if conf >= .4: 136 self.radio.invoke('lo') 137 elif conf < .2: 138 self.radio.invoke('hi') 139 else: 140 self.radio.invoke('med')
141
142 - def get(self):
143 mean = self.scale.get() 144 confidence = self.radio.getcurselection() 145 if confidence == 'lo': 146 span = 0.4 147 elif confidence == 'med': 148 span = 0.2 149 else: 150 span = 0.0 151 return Interval(mean-span,mean+span)
152
153 - def __doCommand(self, valueStr):
154 valueInt = self.scale.get() 155 bottom = float(self['scale_from']) 156 span = float(self['scale_to'])-bottom 157 percent = (float(valueInt)-bottom)/span 158 if self['color']: 159 newColor = '#%02x%02x00' % \ 160 (int((1.0-percent)*255.),int(percent*255.)) 161 else: 162 value = int((1.0-percent)*255.) 163 newColor = '#%02x%02x%02x' % (value,value,value) 164 self.scale.configure(troughcolor=newColor)
165 ## self.value.configure(text = valueStr) 166
167 - def setState(self,state=NORMAL):
168 """Disables all editing widgets""" 169 widget = self.group.component('tag') 170 widget.configure(state=state) 171 self.scale.configure(state=state) 172 if state == NORMAL: 173 self.scale.configure(fg=self.activeFG) 174 else: 175 self.scale.configure(fg=self.disabledFG) 176 if self['confidence']: 177 self.radio.component('menubutton').configure(state=state) 178 if state == NORMAL: 179 self.radio.component('label').configure(fg=self.activeFG) 180 else: 181 self.radio.component('label').configure(fg=self.disabledFG)
182