2 I needed a simple gauge, so I've made on with Pmw.
3 It might be useful for others to use as a base to develop more comples
6 Is it worth cleaning up and submitting?
15 Clayton. VIC Australia
24 if sys.platform == 'win32':
25 # MS-Windows specific fonts
26 label_font = "-family Ariel -size 12"
27 value_font = "-family Ariel -size 12"
28 small_font = "-family {MS Sans Serif} -size 9 -weight bold"
29 header_font = "-family {MS Sans Serif} -weight bold"
31 # X-Windows specific fonts
32 label_font = "-*-helvetica-*-r-*-*-*-160-*-*-*-*-*-*"
33 value_font = "-*-courier-*-r-*-*-*-160-*-*-*-*-*-*"
34 small_font = "-*-helvetica-*-r-*-*-*-130-*-*-*-*-*-*"
35 header_font = "-*-helvetica-bold-r-*-*-*-150-*-*-*-*-*-*"
37 class VerticalGauge(Pmw.MegaWidget):
38 """Vertical gauge with actual and desired settings"""
40 def __init__(self, parent = None, **kw):
44 ('majortickinterval', 10, None),
45 ('minortickinterval', 5, None),
47 ('bg', 'grey', self._backgroundSet),
48 ('actualvalue', 50, self._actualSet),
49 ('desiredvalue', 50, self._desiredSet),
50 ('actualcolour', 'yellow1', None),
51 ('desiredcolour', 'turquoise1', None),
52 ('label', 'Label', None),
54 self.defineoptions(kw, optiondefs)
55 Pmw.MegaWidget.__init__(self, parent)
57 interior = self.interior()
58 interior.grid_rowconfigure(1, weight = 1)
60 interior.grid_columnconfigure(r, weight = 1)
62 self.actuallabel = self.createcomponent('actualLabel',
64 Tkinter.Label, (interior,),
69 fg = self['actualcolour'],
71 self.actuallabel.grid(sticky = "nswe", row = 0, column = 0)
73 self.label = self.createcomponent('label',
75 Tkinter.Label, (interior,),
81 self.label.grid(sticky = "nsew", row = 0, column = 1)
83 self.desiredlabel = self.createcomponent('desiredLabel',
85 Tkinter.Label, (interior,),
90 fg = self['desiredcolour'],
92 self.desiredlabel.grid(sticky = "nswe", row = 0, column = 2)
94 self.canvas = self.createcomponent('canvas',
96 Tkinter.Canvas, (interior,),
101 self.canvas.grid(sticky = "nsew", columnspan = 3, pady = 1)
102 self.canvas.bind("<Configure>", self._createGaugeAxes)
104 self._createGaugeAxes()
106 self.initialiseoptions()
108 def _createGaugeAxes(self, event = None):
111 units = self['units']
112 majortickinterval = self['majortickinterval']
114 gauge_range = max - min
119 h, w = event.height, event.width
121 h = int(c.configure("height")[4])
122 w = int(c.configure("width")[4])
127 c.create_line(self.middle, self.lower, self.middle, self.upper)
129 majortickcount = int((max - min) / majortickinterval)
130 self.axislength = self.lower - self.upper
131 self.majortickdistance = float(self.axislength) / majortickcount
132 self.majortickwidth = w / 5
133 labeloffset = (w / 4) + 10
135 for i in range(majortickcount + 1):
136 v = min + i * majortickinterval
137 d = self.lower - i * self.majortickdistance
138 c.create_line(self.middle, d, self.middle + self.majortickwidth, d)
139 c.create_text(self.middle + labeloffset, d, font = small_font, text = str(v))
141 self._desiredSet(event)
142 self._actualSet(event)
144 def _backgroundSet(self):
145 self.canvas.configure(bg = self['bg'])
147 def _desiredSet(self, event = None):
149 desired = self['desiredvalue']
150 desiredcolour = self['desiredcolour']
155 if desired > max: desired = max
156 if desired < min: desired = min
157 gauge_range = max - min
161 h, w = event.height, event.width
163 h = int(c.configure("height")[4])
164 w = int(c.configure("width")[4])
167 desired_y = self.lower - (float(desired - min) / gauge_range) * self.axislength
170 c.delete('desiredBar')
174 c.create_line(self.middle - self.majortickwidth, desired_y,
175 self.middle + self.majortickwidth, desired_y,
176 fill = desiredcolour, stipple = 'gray50',
177 width = 10, tag = 'desiredBar')
178 self.desiredlabel.configure(text = desired)
180 def setActual(self, value):
181 self.configure(actualvalue = value)
184 return self.cget('actualvalue')
186 def _actualSet(self, event = None):
188 actual = self['actualvalue']
189 actualcolour = self['actualcolour']
194 if actual > max: actual = max
195 if actual < min: actual = min
196 gauge_range = max - min
200 h, w = event.height, event.width
202 h = int(c.configure("height")[4])
203 w = int(c.configure("width")[4])
205 actual_y = self.lower - (float(actual - min) / gauge_range) * self.axislength
208 c.delete('actualPointer')
212 triangle = ((self.middle, actual_y),
213 (self.middle - 1.4 * self.majortickwidth, actual_y - self.majortickwidth / 2),
214 (self.middle - 1.4 * self.majortickwidth, actual_y + self.majortickwidth / 2))
216 c.create_polygon(triangle, fill = actualcolour, tag = 'actualPointer')
217 self.actuallabel.configure(text = actual)
220 Pmw.forwardmethods(VerticalGauge, Tkinter.Canvas, 'canvas')
222 if __name__ == '__main__':
225 # Initialise Tkinter and Pmw.
226 root = Pmw.initialise()
227 root.title('Pmw VerticalGauge demonstration')
238 g1 = VerticalGauge(min = 0,
242 majortickinterval = 2,
244 g1.grid(sticky = "nsew")
245 root.grid_rowconfigure(0, weight = 1)
246 root.grid_columnconfigure(0, weight = 1)
247 b1 = Tkinter.Button(text = "Increase", command = increase)
249 b2 = Tkinter.Button(text = "Decrease", command = decrease)