|
Writing an IDLE extension |
|
========================= |
|
|
|
An IDLE extension can define new key bindings and menu entries for IDLE |
|
edit windows. There is a simple mechanism to load extensions when IDLE |
|
starts up and to attach them to each edit window. (It is also possible |
|
to make other changes to IDLE, but this must be done by editing the IDLE |
|
source code.) |
|
|
|
The list of extensions loaded at startup time is configured by editing |
|
the file config-extensions.def. See below for details. |
|
|
|
An IDLE extension is defined by a class. Methods of the class define |
|
actions that are invoked by event bindings or menu entries. Class (or |
|
instance) variables define the bindings and menu additions; these are |
|
automatically applied by IDLE when the extension is linked to an edit |
|
window. |
|
|
|
An IDLE extension class is instantiated with a single argument, |
|
`editwin', an EditorWindow instance. The extension cannot assume much |
|
about this argument, but it is guaranteed to have the following instance |
|
variables: |
|
|
|
text a Text instance (a widget) |
|
io an IOBinding instance (more about this later) |
|
flist the FileList instance (shared by all edit windows) |
|
|
|
(There are a few more, but they are rarely useful.) |
|
|
|
The extension class must not directly bind Window Manager (e.g. X) events. |
|
Rather, it must define one or more virtual events, e.g. <<z-in>>, and |
|
corresponding methods, e.g. z_in_event(). The virtual events will be |
|
bound to the corresponding methods, and Window Manager events can then be bound |
|
to the virtual events. (This indirection is done so that the key bindings can |
|
easily be changed, and so that other sources of virtual events can exist, such |
|
as menu entries.) |
|
|
|
An extension can define menu entries. This is done with a class or instance |
|
variable named menudefs; it should be a list of pairs, where each pair is a |
|
menu name (lowercase) and a list of menu entries. Each menu entry is either |
|
None (to insert a separator entry) or a pair of strings (menu_label, |
|
virtual_event). Here, menu_label is the label of the menu entry, and |
|
virtual_event is the virtual event to be generated when the entry is selected. |
|
An underscore in the menu label is removed; the character following the |
|
underscore is displayed underlined, to indicate the shortcut character (for |
|
Windows). |
|
|
|
At the moment, extensions cannot define whole new menus; they must define |
|
entries in existing menus. Some menus are not present on some windows; such |
|
entry definitions are then ignored, but key bindings are still applied. (This |
|
should probably be refined in the future.) |
|
|
|
Extensions are not required to define menu entries for all the events they |
|
implement. (They are also not required to create keybindings, but in that |
|
case there must be empty bindings in cofig-extensions.def) |
|
|
|
Here is a partial example from zzdummy.py: |
|
|
|
class ZzDummy: |
|
|
|
menudefs = [ |
|
('format', [ |
|
('Z in', '<<z-in>>'), |
|
('Z out', '<<z-out>>'), |
|
] ) |
|
] |
|
|
|
def __init__(self, editwin): |
|
self.editwin = editwin |
|
|
|
def z_in_event(self, event=None): |
|
"...Do what you want here..." |
|
|
|
The final piece of the puzzle is the file "config-extensions.def", which is |
|
used to configure the loading of extensions and to establish key (or, more |
|
generally, event) bindings to the virtual events defined in the extensions. |
|
|
|
See the comments at the top of config-extensions.def for information. It's |
|
currently necessary to manually modify that file to change IDLE's extension |
|
loading or extension key bindings. |
|
|
|
For further information on binding refer to the Tkinter Resources web page at |
|
python.org and to the Tk Command "bind" man page. |
|
|