1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 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.
|