#!/bin/sh """:" exec python $0 ${1+"$@"} """ # ---------------------- HelloUser.py ---------------------- # # This program demonstrates how to build a user-friendly GUI # around the Blt Graph. The user can select grid colors, # cross hairs colors and numerous other options just by # selecting it from a menu. The user can also read a graph # from file, and store it as a postscript file. # from Tkinter import * # The Tk package import tkFileDialog # To be able to ask for files import Pmw # The Python MegaWidget package import math # import the sin-function import string # Make a customized Combobox (used in graphSetup) def cBox(f, label, items): box = Pmw.ComboBox(f, label_text = label, labelpos = 'w', scrolledlist_items = items) box.pack(fill = 'both', expand = 1, padx = 8, pady = 8) return box # Make a dialog, and ask for a specified graph's color, linewidth etc. # This function is called when the graph is double-clicked. def graphSetup(args): global dialog, colBox, symBox, scoBox, solBox, smtBox, linBox el = g.element_closest(args.x, args.y, interpolate=1) elName = el["name"] if dialog == None: # Don't create the dialog each time - waste of cpu-cycles! dialog = Pmw.Dialog(master) dialog.configure( buttons = ('OK',), title = 'Edit graph', command = dialog.deactivate) dialog.withdraw() f = Frame(dialog.interior()) f.pack() colBox = cBox(f, "Color:", ('red', 'yellow', 'blue', 'green', 'black', 'grey')) symBox = cBox(f, 'Symbols:', ("", "square", "circle", "diamond", "cross", "triangle")) scoBox = cBox(f, 'Symbol color:', ('defcolor', 'red', 'yellow', 'blue', 'green', 'black', '')) solBox = cBox(f, 'Symbol outline:', ('defcolor', 'red', 'yellow', 'blue', 'green', 'black')) smtBox = cBox(f, 'Smootheness:', ('step', 'linear', 'quadratic', 'natural')) linBox = cBox(f, 'Line thickness:', (0, 1, 2, 3, 4, 5)) # Retrieve the current setup for the graph... colBox.selectitem(g.element_cget(elName, "color")) symBox.selectitem(g.element_cget(elName, "symbol")) scoBox.selectitem(g.element_cget(elName, "fill")) solBox.selectitem(g.element_cget(elName, "outline")) smtBox.selectitem(g.element_cget(elName, "smooth")) linBox.selectitem(g.element_cget(elName, "linewidth")) # Let the user interact dialog.activate() # Update any changes g.element_configure(elName, color=colBox.get(), symbol=symBox.get(), smooth=smtBox.get(), linewidth=linBox.get(), fill=scoBox.get(), outline=solBox.get()) # shows a FileDialog, and opens the selected file. The file must be # a text file with each line on the form: # <whitespace><number><whitespace><comma><whitespace><number><whitespace>\n def openFile(): global vector_x global vector_y fname = tkFileDialog.Open().show() if fname <> "": file = open(fname, 'r') i = len(vector_x) vector_x.append([]) vector_y.append([]) for line in file.readlines(): [x, y] = string.split(line, ',') vector_x[i].append(float(x)) vector_y[i].append(float(y)) graphName = "Graph " +str(i+1) g.line_create(graphName, xdata=tuple(vector_x[i]), ydata=tuple(vector_y[i]), color="blue", scalesymbols=1) g.element_bind(graphName, sequence="<Double-Button-1>", func=graphSetup) # Empties the plotting window def newFile(): for name in g.element_names(): g.element_delete(name) # Saves the plot as postscript file 'HelloUser.ps' def postscript(): g.postscript_output(fileName='HelloUser.ps', decorations='no') # The next functions configure the axes def showAxis(): state = int(g.axis_cget("x", 'hide')) g.axis_configure(["x", "y"], hide = not state) def xlogScale(): state = int(g.xaxis_cget('logscale')) g.xaxis_configure(logscale = not state) def ylogScale(): state = int(g.yaxis_cget('logscale')) g.yaxis_configure(logscale = not state) def descending(): state = int(g.axis_cget("x", 'descending')) g.axis_configure(["x", "y"], descending = not state) # The next functions configures the Crosshairs def mouseMove(event): g.crosshairs_configure(position="@" +str(event.x) +","+str(event.y)) def showCrosshairs(): hide = not int(g.crosshairs_cget('hide')) g.crosshairs_configure(hide = hide, dashes="1") if(hide): g.unbind("<Motion>") else: g.bind("<Motion>", mouseMove) def redCross(): g.crosshairs_configure(color = "red") def blueCross(): g.crosshairs_configure(color = "blue") def greenCross(): g.crosshairs_configure(color = "green") def blackCross(): g.crosshairs_configure(color = "black") # The next functions configures the Grid def showGrid(): g.grid_toggle() def redGrid(): g.grid_configure(color = "red") def blueGrid(): g.grid_configure(color = "blue") def greenGrid(): g.grid_configure(color = "green") def blackGrid(): g.grid_configure(color = "black") # The next functions configures the Legend def showLegend(): state = int(g.legend_cget('hide')) g.legend_configure(hide = not state) def raiseLegend(): g.legend_configure(relief="raised") def flattenLegend(): g.legend_configure(relief="flat") def sinkLegend(): g.legend_configure(relief="sunken") # The next two functions are customized functions for making menus. def myaddmenu(menuBar, owner, label, command): menuBar.addmenuitem(owner, 'command', '<help context>', label = label, command = command) def mychkmenu(menuBar, owner, label, command): menuBar.addmenuitem(owner, 'checkbutton', '<help context>', label = label, command = command, variable=IntVar()) vector_x = [] vector_y = [] master = Tk() # build Tk-environment dialog = None # Create and pack the MenuBar. menuBar = Pmw.MenuBar(master, hull_relief = 'raised', hull_borderwidth = 1) menuBar.pack(fill = 'x') # Make the File menu menuBar.addmenu('File', 'helptxt') myaddmenu(menuBar, 'File', 'New', newFile) myaddmenu(menuBar, 'File', 'Open...', openFile) myaddmenu(menuBar, 'File', 'Save as ps', postscript) menuBar.addmenuitem('File', 'separator') myaddmenu(menuBar, 'File', 'Quit', master.quit) # Make the Axis menu menuBar.addmenu('Axis', '') mychkmenu(menuBar, 'Axis', 'hide', showAxis ) mychkmenu(menuBar, 'Axis', 'x logscale', xlogScale ) mychkmenu(menuBar, 'Axis', 'y logscale', ylogScale ) mychkmenu(menuBar, 'Axis', 'descending', descending) # Make the Crosshairs menu menuBar.addmenu('Crosshairs', '') mychkmenu(menuBar, 'Crosshairs', 'show', showCrosshairs) menuBar.addcascademenu('Crosshairs', 'Color', '') myaddmenu(menuBar, 'Color', 'red', redCross ) myaddmenu(menuBar, 'Color', 'blue', blueCross ) myaddmenu(menuBar, 'Color', 'green', greenCross) myaddmenu(menuBar, 'Color', 'black', blackCross) # Make the Grid menu menuBar.addmenu('Grid', '') mychkmenu(menuBar, 'Grid', 'show', showGrid) menuBar.addcascademenu('Grid', 'Color ', '') myaddmenu(menuBar, 'Color ', 'red', redGrid ) myaddmenu(menuBar, 'Color ', 'blue', blueGrid ) myaddmenu(menuBar, 'Color ', 'green', greenGrid) myaddmenu(menuBar, 'Color ', 'black', blackGrid) # Make the Legend menu menuBar.addmenu('Legend', '') mychkmenu(menuBar, 'Legend', 'hide', showLegend) menuBar.addcascademenu('Legend', 'Relief', '') myaddmenu(menuBar, 'Relief', 'raised', raiseLegend ) myaddmenu(menuBar, 'Relief', 'flat', flattenLegend ) myaddmenu(menuBar, 'Relief', 'sunken', sinkLegend ) # Make the graph area g = Pmw.Blt.Graph(master) g.pack(expand=1, fill='both') g.configure(title='Hello User!') # enter a title master.mainloop() # ...and wait for input