a71c5c346b1570cfef8ff282e00adbdaf6bcaafa
title
= 'Blt Graph demonstration'
# Import Pmw from this directory tree.
sys
.path
[:0] = ['../../..']
# Simple random number generator.
rand
= (rand
* 125) % 2796203
class GraphDemo(Pmw
.MegaToplevel
):
def __init__(self
, parent
=None, **kw
):
# Define the megawidget options.
('size', 10, Pmw
.INITOPT
),
self
.defineoptions(kw
, optiondefs
)
# Initialise the base class (after defining the options).
Pmw
.MegaToplevel
.__init
__(self
, parent
)
# Check keywords and initialise options.
# Create vectors for use as x and y data points.
self
._vectorSize
= self
['size']
self
._vector
_x
= Pmw
.Blt
.Vector()
for y
in range(self
._numElements
):
self
._vector
_y
.append(Pmw
.Blt
.Vector())
for index
in range(self
._vectorSize
):
self
._vector
_x
.append(index
)
for y
in range(self
._numElements
):
self
._vector
_y
[y
].append(random() % 100)
interior
= self
.interior()
controlFrame
= Tkinter
.Frame(interior
)
controlFrame
.pack(side
= 'bottom', fill
= 'x', expand
= 0)
# Create an option menu for the kind of elements to create.
elementtype
= Pmw
.OptionMenu(controlFrame
,
label_text
= 'Element type',
items
= ['bars', 'lines', 'mixed', 'none'],
command
= self
._setelementtype
,
elementtype
.pack(side
= 'left')
# Create an option menu for the barmode option.
barmode
= Pmw
.OptionMenu(controlFrame
,
items
= ['normal', 'stacked', 'aligned', 'overlap'],
command
= self
._setbarmode
,
barmode
.pack(side
= 'left')
# Create an option menu for the smooth option.
self
.smooth
= Pmw
.OptionMenu(controlFrame
,
items
= ['linear', 'step', 'natural', 'quadratic'],
command
= self
._setsmooth
,
self
.smooth
.pack(side
= 'left')
# Create an option menu to reverse sort the elements.
sortelements
= Pmw
.OptionMenu(controlFrame
,
items
= ['normal', 'reverse'],
command
= self
._setsortelements
,
sortelements
.pack(side
= 'left')
# Create an option menu for the bufferelements option.
bufferelements
= Pmw
.OptionMenu(controlFrame
,
label_text
= 'Buffering',
items
= ['buffered', 'unbuffered'],
command
= self
._setbufferelements
,
bufferelements
.pack(side
= 'left')
# Create a button to add a point to the vector.
addpoint
= Tkinter
.Button(controlFrame
, text
= 'Add point',
command
= Pmw
.busycallback(self
._addpoint
))
addpoint
.pack(side
= 'left', fill
= 'x', expand
= 0)
# Create a button to close the window
close
= Tkinter
.Button(controlFrame
, text
= 'Close',
command
= Pmw
.busycallback(self
.destroy
))
close
.pack(side
= 'left', fill
= 'x', expand
= 0)
# Create the graph and its elements.
self
._graph
= Pmw
.Blt
.Graph(interior
)
self
._graph
.pack(expand
= 1, fill
= 'both')
self
._graph
.yaxis_configure(command
=self
.yaxisCommand
)
elementtype
.invoke('mixed')
bufferelements
.invoke('buffered')
def yaxisCommand(self
, graph
, value
):
return '%d %3d' % (num
* 3, num
)
return '%g %3g' % (num
* 3, num
)
def _setelementtype(self
, type):
elements
= self
._graph
.element_names()
apply(self
._graph
.element_delete
, elements
)
colorList
= Pmw
.Color
.spectrum(self
._numElements
)
for elem
in range(self
._numElements
):
hue
= (elem
+ 1.0) / self
._numElements
* 6.28318
foreground
= colorList
[elem
]
background
= Pmw
.Color
.changebrightness(self
, foreground
, 0.8)
if elem
< self
._numElements
/ 2:
ydata
=self
._vector
_y
[elem
],
ydata
=self
._vector
_y
[elem
],
smooth
= self
.smooth
.getcurselection(),
def _setbarmode(self
, tag
):
self
._graph
.configure(barmode
= tag
)
def _setsmooth(self
, tag
):
for element
in self
._graph
.element_show():
if self
._graph
.element_type(element
) == 'line':
self
._graph
.element_configure(element
, smooth
= tag
)
def _setbufferelements(self
, tag
):
self
._graph
.configure(bufferelements
= (tag
== 'buffered'))
def _setsortelements(self
, tag
):
element_list
= list(self
._graph
.element_show())
if len(element_list
) > 1:
if (tag
== 'normal') == (element_list
[-1] != 'var0'):
self
._graph
.element_show(element_list
)
self
._vector
_x
.append(self
._vectorSize
)
for y
in range(self
._numElements
):
self
._vector
_y
[y
].append(random() % 100)
self
._vectorSize
= self
._vectorSize
+ 1
def __init__(self
, parent
):
if not Pmw
.Blt
.haveblt(parent
):
message
= 'Sorry\nThe BLT package has not been\n' + \
'installed on this system.\n' + \
'Please install it and try again.'
w
= Tkinter
.Label(parent
, text
= message
)
w
.pack(padx
= 8, pady
= 8)
message
= 'This is a simple demonstration of the\n' + \
'BLT graph widget.\n' + \
'Select the number of points to display and\n' + \
'click on the button to display the graph.'
w
= Tkinter
.Label(parent
, text
= message
)
w
.pack(padx
= 8, pady
= 8)
# Create combobox to select number of points to display.
self
.combo
= Pmw
.ComboBox(parent
,
scrolledlist_items
= ('10', '25', '50', '100', '300'),
self
.combo
.pack(padx
= 8, pady
= 8)
# Create button to start blt graph.
start
= Tkinter
.Button(parent
,
command
= Pmw
.busycallback(self
.showGraphDemo
))
start
.pack(padx
= 8, pady
= 8)
size
= string
.atoi(self
.combo
.get())
demo
= GraphDemo(self
.parent
, size
= size
)
######################################################################
# Create demo in root window for testing.
if __name__
== '__main__':
exitButton
= Tkinter
.Button(root
, text
= 'Exit', command
= root
.destroy
)
exitButton
.pack(side
= 'bottom')