mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 05:31:20 +00:00 
			
		
		
		
	
		
			
	
	
		
			107 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
		
		
			
		
	
	
			107 lines
		
	
	
	
		
			4.4 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
|   | 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 extend.py; see below for details. | ||
|  | 
 | ||
|  | An IDLE extension is defined by a class.  Methods of the class define | ||
|  | actions that are invoked by those 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 guarateed 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 bind key events.  Rather, it must define | ||
|  | one or more virtual events, e.g. <<zoom-height>>, and corresponding | ||
|  | methods, e.g. zoom_height_event(), and have one or more class (or instance) | ||
|  | variables that define mappings between virtual events and key sequences, | ||
|  | e.g. <Alt-F2>.  When the extension is loaded, these key sequences will | ||
|  | be bound to the corresponding virtual events, and the virtual events | ||
|  | will be bound to the corresponding methods.  (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.) | ||
|  | 
 | ||
|  | The following class or instance variables are used to define key | ||
|  | bindings for virtual events: | ||
|  | 
 | ||
|  |     keydefs		for all platforms | ||
|  |     mac_keydefs		for Macintosh | ||
|  |     windows_keydefs	for Windows | ||
|  |     unix_keydefs	for Unix (and other platforms) | ||
|  | 
 | ||
|  | Each of these variables, if it exists, must be a dictionary whose | ||
|  | keys are virtual events, and whose values are lists of key sequences. | ||
|  | 
 | ||
|  | An extension can define menu entries in a similar fashion.  This is done | ||
|  | with a class or instance variable named menudefs; it should be a list of | ||
|  | pair, 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 the key bindings | ||
|  | are still applied.  (This should probably be refined in the future.) | ||
|  | 
 | ||
|  | Here is a complete example example: | ||
|  | 
 | ||
|  | class ZoomHeight: | ||
|  | 
 | ||
|  |     menudefs = [ | ||
|  |         ('edit', [ | ||
|  |             None, # Separator | ||
|  |             ('_Zoom Height', '<<zoom-height>>'), | ||
|  |          ]) | ||
|  |     ] | ||
|  | 
 | ||
|  |     windows_keydefs = { | ||
|  |         '<<zoom-height>>': ['<Alt-F2>'], | ||
|  |     } | ||
|  |     unix_keydefs = { | ||
|  |         '<<zoom-height>>': ['<Control-z><Control-z>'], | ||
|  |     } | ||
|  | 
 | ||
|  |     def __init__(self, editwin): | ||
|  |         self.editwin = editwin | ||
|  | 
 | ||
|  |     def zoom_height_event(self, event): | ||
|  |         "...Do what you want here..." | ||
|  | 
 | ||
|  | The final piece of the puzzle is the file "extend.py", which contains a | ||
|  | simple table used to configure the loading of extensions.  This file | ||
|  | currently contains a single list variable named "standard", which is a | ||
|  | list of extension names that are to be loaded.  (In the future, other | ||
|  | configuration variables may be added to this module.) | ||
|  | 
 | ||
|  | Extensions can define key bindings and menu entries that reference | ||
|  | events they don't implement (including standard events); however this is | ||
|  | not recommended (and may be forbidden in the future). | ||
|  | 
 | ||
|  | Extensions are not required to define menu entries for all events they | ||
|  | implement. | ||
|  | 
 | ||
|  | Note: in order to change key bindings, you must currently edit the file | ||
|  | keydefs.  It contains two dictionaries named and formatted like the | ||
|  | keydefs dictionaries described above, one for the Unix bindings and one | ||
|  | for the Windows bindings.  In the future, a better mechanism will be | ||
|  | provided. |