summaryrefslogtreecommitdiff
path: root/MAPPING
diff options
context:
space:
mode:
authorJames Henstridge <jamesh@src.gnome.org>1999-02-23 11:35:36 +0000
committerJames Henstridge <jamesh@src.gnome.org>1999-02-23 11:35:36 +0000
commit6ac71b407ccb08ed53f4251916781bd081f60373 (patch)
treeaa10c7ab81a13ffeccb7d6051e8651966d67235b /MAPPING
parent4331a74c8ff40502c213eed791ed775b4ab619f9 (diff)
downloadpygtk-6ac71b407ccb08ed53f4251916781bd081f60373.tar.gz
Oops ... forgot to include this added file in the last commit.
Diffstat (limited to 'MAPPING')
-rw-r--r--MAPPING170
1 files changed, 170 insertions, 0 deletions
diff --git a/MAPPING b/MAPPING
new file mode 100644
index 00000000..fb758e46
--- /dev/null
+++ b/MAPPING
@@ -0,0 +1,170 @@
+The mapping of GTK+ onto Python
+===============================
+
+This file documents the mapping of the C GTK+ functions and types in
+the pygtk package. If you want just enough information on how to use
+C documentation to help you program with pygtk or help you read or
+translate GTK+ programs written in C, then see the "Mapping of GTK+
+functions to gtk.py" section.
+
+
+The _gtk module
+===============
+
+This module is almost a direct mapping of the GTK+ functions. It has
+no object oriented constructs and is the part written in C. Large
+parts of it are generated from .defs files (which are also used in the
+guile and perl bindings), while some is written in hand crafted C.
+Note that this module is mainly a convenience that makes it easier to
+code the higher level gtk.py.
+
+There are a number of types defined by this module. The main one is a
+wrapper for GtkObject and all its descendants. This type is just a
+wrapper round the pointer, and calls gtk_object_ref on creation, and
+gtk_object_unref on destruction (hence the C structure will not be
+freed while python has a reference to it).
+
+For all the functions in _gtk that take GtkObject descendents as
+arguments, the type conversion is done automatically (so you don't
+have to call GTK_WIDGET or GTK_CONTAINER type macros). So at this
+level, reference counting and type casting has already been taken care
+of.
+
+Also a number of other types are defined in this module. For these
+objects, there are relatively few functions and attributes specific to
+the individual types, so I have spent some time writing nice
+interfaces to them. Outlines of the available attributes and methods
+of these types are available in the file description.py, which is
+distributed with pygtk. These types include:
+ GtkCTreeNode
+ GtkStyle
+ GtkSelectionData
+ GdkAtom
+ GdkColor
+ GdkColormap
+ GdkCursor
+ GdkDragContext
+ GdkEvent
+ GdkFont
+ GdkGC
+ GdkWindow (aka GdkDrawable aka GdkPixmap aka GdkBitmap)
+
+Also, for the functions defined in _gtk, enumerations and flags are
+handled specially. Where an enumeration value is to be passed to a
+function, you can give it an integer representing its value, or a
+string representing the name. For the list of names that can be used,
+see the file gtk.defs that comes with the GTK+ distribution. The
+(define-enum) and (define-flags) sections list the possible values.
+For flags, you can pass any value that would be accepted as an enum
+value in adition to a tuple of strings, which would be converted to
+their corresponding numeric values and ORed together.
+
+GTK.py and GDK.py
+=================
+
+These python modules define the numerical values for the host of enums
+and flags in gtk and gdk respectively. The GTK_ prefix has been
+removed from the gtk enums, and the GDK_ prefix from the GDK ones
+(where this would leave the identifier starting with a digit, an
+underscore has been prepended). This way if you do an "import GTK",
+you reference the constants with a gtk prefix (eg GTK.STATE_NORMAL),
+or if you do a "from GTK import *" you can access the constants via
+shorter names (eg STATE_NORMAL).
+
+With _gtk, GTK.py and GDK.py, you should be able to write programs
+that quite closely resemble the what they would look like in C (minus
+type casts and occasional referencing/dereferencing).
+
+gtk.py
+======
+
+This module is meant to be the high level interface that will be used
+by most programmers. It defines a number of classes that mirror the
+class heirachy of the GtkObject descendents found in GTK+. Each of
+these classes has an _o attribute which points to an instance of the
+GtkObject wrapper type from _gtk.
+
+Because of reference counting problems (we don't want the GTK object
+to die while we have a reference to the python one, and we don't want
+the python one to die while we have a reference to the GTK object --
+circular reference alert :), there will usually be more than one of
+these python wrappers existing for a single GtkObject (ie. a 1 to many
+relationship). The bigest example of this is signal handlers where a
+different object will always be passed in. This means that any
+attributes you set on the object (ie. obj.foo = "bar") will not be
+visible inside the callback. You can get round this by using the
+object data mechanisms:
+ obj.set_data("string_tag", data)
+ data = obj.get_data("string_tag")
+
+This data will be accessible to every instance pointing to a single
+GtkObject.
+
+Since there are two times you may want to create instances of these
+classes, there are two ways to call their constructors:
+ - as normal to create a new C level object.
+ - as 'GtkSomething(_obj=obj)', which does not create a new C level
+ object, but creates a new python instance that represents the C
+ level object wrapped by obj.
+
+The second way of creating instances is done by giving default values
+for all the constructor arguments, and adding "_obj=None" to the end
+of the argument list. Then the first line of the constructor is set
+to:
+ if _obj: self._o = _obj; return
+
+Mapping of GTK+ functions to gtk.py
+===================================
+
+For each GtkObject descendent, there is a python class of the same
+name. It will list the C class's superclass as its superclass. For
+each desendant, say GtkSomething, there will be a function defined in
+GTK+ called gtk_something_new() or similar. This is mapped to the
+constructor for the class.
+
+There are usually a number of other functions starting with
+gtk_something_ in GTK+. These functions will generally take an
+instance of GtkSomething as the first argument. These map to methods
+of the python class. So the following:
+ gtk_something_method(GtkSomething *something, args, ...)
+maps to this:
+ something.method(args, ...)
+
+Note that this means that methods of the parent class are accessed as
+easily as those of the actual class.
+
+There are a few special cases of course. For instance, all the
+gtk_drag_*() functions have been mapped to GtkWidget.drag_*(), and the
+gtk_selection_*() functions have been mapped to
+GtkWidget.selection_*().
+
+The object argument mechanisms are also implemented in pygtk. You can
+query and change these properties on an already instantiated object
+using the mapping behaviour similar to the way you can in Tkinter (eg
+label_widget['label'] = 'Hello' will change a label's text). You can
+also create new objects and setting their object arguments at creation
+time with the new() method. The first argument should be the class
+object for the instance you want. The rest of the arguments should be
+keyword arguments specifying the object arguments you want to set (eg
+label = new(GtkLabel, label='Hello')).
+
+There are also a number of other functions not associated with any
+particular class that are accessible through the global scope of the
+gtk.py module. It is probably easiest to read the end of gtk.py to
+get a feel for these functions.
+
+gtk.py also imports the GTK constants with "from GTK import *", and
+the GDK constants with "import GDK". The reasons for using "from GTK
+import *" are partly for convenience and partly because thats how I
+did it when I first wrote pygtk :)
+
+Conclusions
+===========
+
+That about sums up the language mapping in pygtk. The best way of
+learning how to program in pygtk is to read sample code. Take a look
+at the examples/ directory, and go through the examples there.
+
+If you think something is missing from this document, please mail me
+at <james@daa.com.au>.
+