wafepython

Gustaf Neumann (neumann@watson.ibm.com)
Sun, 5 Jun 1994 00:55:41 GMT

Some if you might find the following useful, the source and sample programs
are included below.

Enjoy
-gustaf
=======================================================
Wafepython is an extension to Python allowing to build python
applications with graphical user interfaces based on the OSF/Motif or
Athena Widget set. Wafe can be build with X11R4 (not recommended),
X11R5 and X11R6. Wafe is essentially Tcl+Xt+Extensions+WidgetSets.
Wafe was initially developed as a tool for building frontends for
non-c-languages, but can be used as well as a scripting language based
on Tcl, as an interactive shell, or for embedding in various
languages. Wafepython is an example of embedding (as wafeperl is for
extending Perl with GUI functionality)

As shipped on can build either an OSF/MOTIF version using

- OSF/Motif 1.1 or OSF/Motif 1.2 (all widgets are supported)
- XmGraph (an editable graph widget by Douglas Young)
- Plotter (series of widgets for bar and line graphs
(Peter Klingebiel <klin@iat.uni-paderborn.de>
- HTML widget (from Mosaic 2.4, Marc Andreessen, former NCSA)
- XPM-Library (Arnaud Le Hors <lehors@sophia.inria.fr>)
- RDD (Drag and Drop library, can be used in parallel to the
Motif 1.2 drag and drop code, by Roger Reynolds <rogerr@netcom.com>)
- debug (debugging and profiling by Fred Fish)

The Athena widget set library is shipped to build with the following
packages:

- Xaw3d (3d version of the Athena widget set, all widgets are
supported, including the Layout widget by Keith Packard)
- Plotter (series of widgets for bar and line graphs
(Peter Klingebiel <klin@iat.uni-paderborn.de>
- HTML widget (from Mosaic 2.4, Marc Andreessen, former NCSA)
- XPM-Library (Arnaud Le Hors <lehors@sophia.inria.fr>)
- RDD (Drag and Drop library)
- debug (debugging and profiling by Fred Fish)

Wafepython has a bi-directional calling interface between
Python and Wafe based on strings.

Wafe tries to be a "thin-as-possible" interface to Xt and the
supported widget sets. About 70% of the c-code of Wafe are generated
(by a Perl program). This allows low maintenance costs for supporting
the extensive functionality of X11 and reduces the number of bugs in
Wafe. Wafepython is in the same sense minimal and supports currently
the following commands:

wafe.cmd(string) evaluate string as Wafe command
wafe.set(nameString,valueString) set the Tcl variable named in
the first argument to the value
in the second argument
wafe.process_events() start the event processing loop
of Wafe (should be the last command
in the script)

In addition, the following Wafe commands are created during
initialization of Wafe to archive the Wafe-calls-Python interface:

pythonS <pythonFunctionName> <0-3 arguments>
pythonE <pythonFunction>

pythonS is a Tcl function purely using strings as input arguments and
as return value. If other data types are needed, the Python function
has to perform the conversions (eg. using eval()). The 0-3 limitation
on the number of arguments is due to the structure of mkvalue; I have
not figured out yet, how to produce a tuple with arbitrary elements.

pythonE obtains single argument and evaluates it using the Python C
function run_string. The argument has to have valid Python Syntax
(quoting etc), pythonE doe NOT return a result (see below).

Four sample scripts (demo1 to demo4) are shipped with wafepython. The
first two are for the Athena widget set, the latter are for OSF/Motif.
The demo scripts are VERY similar to the scripts provided with
wafeperl and do not exploit any sophisticated python functionality.

Installation
------------

To install wafepython, expand wafepython.tar.gz in the python source
tree such that a subdirectory wafe is created under Extensions. If
you do not have the Python extensions install, obtain
extensions.tar.gz from ftp.cwi.nl (it is needed mainly for creating
the Makefile). In addition, obtain a recent version of Wafe from
ftp.wu-wien.ac.at:pub/src/X11/wafe/* which contains all of the
supported packages (except OSF/Motif and Xaw3d). As shipped,
wafepython is configured to build with the Athena widget set.

Go into python*/Extension/wafe and edit Setup.in. you will have to
set the WAFEHOME directory and you might want to change the provided
setup (building for example a Motif version). To build wafepython,
issue the following commands

make Makefile -f Makefile.pre.in
make

This should build a new python binary in the python*/Extension/wafe
directory. Note, that the demo scripts use the name wafepython and
mofepython in their header line. you might want to rename python to
these names as well.

Comments
--------

I ftped the python yesterday at about 8pm, which was the first time, i
saw a Python program. Obviously, the python documentation is very
good, since installation, reading through the introduction etc went
very smoothly. The only thing which did not work as expected was, that
it seems to be impossible to obtain useful return values from a Python
function via the run_string() interface (a return value is obtained
iff the reason code "why" is set to WHY_RETURN, which i was unable to
provide). What is the reason for this? The usage of INCREF and DECREF
is still mystical to be (which c-function does already the
incrementing or decrementing), but as i said, i am a Python newbie.

The biggest problem i had was using Python together with certain
OSF/Motif widgets. It turns out that if regular expression externals
in OSF/Motif are resolved against the python libraries, weird things
start to happen. I would strongly recommend to hide these externals in
future versions of Python. For the time being, please apply the
following patch below (made against python-1.0.2).

wafepython was developed under Linux 1.0 and tested under AIX 3.2.5 as
well.

Gustaf Neumann Mohegan Lake, NY, Sat Jun 4 18:58:22

====================================================================
*** Modules/Setup.in.ORIG Sat Jun 4 17:28:39 1994
--- Modules/Setup.in Sat Jun 4 17:46:15 1994
***************
*** 58,63 ****
--- 58,71 ----

PYTHONPATH=.:$(DESTLIB)$(TESTPATH)$(ARCHPATH)$(STDWINPATH)

+ RENAMEREGEXP = \
+ re_compile_fastmap=PYre_compile_fastmap \
+ -Dre_compile_pattern=PYre_compile_pattern \
+ -Dre_match=PYre_match \
+ -Dre_match_2=PYre_match_2 \
+ -Dre_search=PYre_search \
+ -Dre_search_2=PYre_search_2 \
+ -Dre_set_syntax=PYre_set_syntax

# Modules that should always be present (non UNIX dependent)

***************
*** 65,71 ****
math mathmodule.o # math library functions, e.g. sin()
parser parsermodule.o # raw interface to the Python parser
posix posixmodule.o # posix (UNIX) system calls
! regex regexmodule.o regexpr.o # Regular expressions, GNU Emacs style
strop stropmodule.o # fast string operations implemented in C
struct structmodule.o # binary structure packing/unpacking
time timemodule.o # time operations and variables
--- 73,79 ----
math mathmodule.o # math library functions, e.g. sin()
parser parsermodule.o # raw interface to the Python parser
posix posixmodule.o # posix (UNIX) system calls
! regex regexmodule.o regexpr.o -D$(RENAMEREGEXP) # Regular expressions, G
NU Emacs style
strop stropmodule.o # fast string operations implemented in C
struct structmodule.o # binary structure packing/unpacking
time timemodule.o # time operations and variables

============================================================
begin 644 wafepy.tar.gz
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
!`$J+
`
end

--
Gustaf Neumann                     neumann@watson.ibm.com
Postdoctoral/Visiting Scientist    Tel: (914) 784 7086
IBM T.J.Watson Research Center, P.O.Box 704
Yorktown Heights, New York 10598