#!/bin/sh
""":"
exec python $0 ${1+"$@"}
"""
# ------------------- HelloMagnifier.py -------------------
#
# This program demonstrates how to implement possibilities
# for zooming in and out using the mouse. To zoom, drag and
# mark a rectangle with the mouse. Left button zooms in, and
# right button zooms out.
#
from Tkinter import * # The Tk package
import Pmw # The Python MegaWidget package
import math # import the sin-function
master = Tk() # build Tk-environment
ncurves = 4 # draw 4 curves
npoints = 32 # use 32 points on each curve
def zoom(x0, y0, x1, y1):
g.xaxis_configure(min=x0, max=x1)
g.yaxis_configure(min=y0, max=y1)
def mouseDrag(event):
global x0, y0, x1, y1
(x1, y1) = g.invtransform(event.x, event.y)
g.marker_configure("marking rectangle",
coords = (x0, y0, x1, y0, x1, y1, x0, y1, x0, y0))
def mouseUp(event):
global dragging
global x0, y0, x1, y1
if dragging:
g.unbind(sequence="<Motion>")
g.marker_delete("marking rectangle")
if x0 <> x1 and y0 <> y1:
# make sure the coordinates are sorted
if x0 > x1: x0, x1 = x1, x0
if y0 > y1: y0, y1 = y1, y0
if event.num == 1:
zoom(x0, y0, x1, y1) # zoom in
else:
(X0, X1) = g.xaxis_limits()
k = (X1-X0)/(x1-x0)
x0 = X0 -(x0-X0)*k
x1 = X1 +(X1-x1)*k
(Y0, Y1) = g.yaxis_limits()
k = (Y1-Y0)/(y1-y0)
y0 = Y0 -(y0-Y0)*k
y1 = Y1 +(Y1-y1)*k
zoom(x0, y0, x1, y1) # zoom out
def mouseDown(event):
global dragging, x0, y0
dragging = 0
if g.inside(event.x, event.y):
dragging = 1
(x0, y0) = g.invtransform(event.x, event.y)
g.marker_create("line", name="marking rectangle", dashes=(2, 2))
g.bind(sequence="<Motion>", func=mouseDrag)
############################## main program ################################
if not Pmw.Blt.haveblt(master): # Is Blt installed?
print("BLT is not installed!")
else:
vector_x = [] # make vector for x-axis
vector_y = []
for y in range(ncurves):
vector_y.append([]) # make list of curves
for x in range(npoints+1): # for each point...
vector_x.append(x*0.1) # compute the x value
# fill vectors with cool graphs
for c in range(ncurves): # for each curve...
vector_y[c].append(math.sin(c*x*0.1)) # compute the y value
g = Pmw.Blt.Graph(master) # make a new graph area
g.pack(expand=1, fill='both')
color = ['red', '#ff9900', 'blue', '#00cc00', 'black', 'grey']
for c in range(ncurves): # for each curve...
curvename = 'sin(' + str(c) +'x)' # make a curvename
g.line_create(curvename, # and create the graph
xdata=tuple(vector_x), # with x data,
ydata=tuple(vector_y[c]), # and y data
color=color[c], # and a nice color
linewidth=2, # and fat lines
symbol='') # and no markers
g.bind(sequence="<ButtonPress>", func=mouseDown)
g.bind(sequence="<ButtonRelease>", func=mouseUp )
# enter a title
g.configure(title='Hello Magnifier\nDrag to magnify. Left: zoom in, right: zoom out')
master.mainloop() # ...and wait for input