编写一个IDLE扩展
=========================

IDLE 扩展可以为 IDLE 编辑窗口定义新的键绑定和菜单项。有一个简单的机制可以在 IDLE 启动时加载扩展并将它们附加到每个编辑窗
口。 （也可以对 IDLE 进行其他更改，但这必须通过编辑 IDLE 源代码来完成。）

在启动时加载的扩展列表是通过编辑文件 config-extensions.def 来配置的。详情请见下文。

IDLE 扩展由类定义。类的方法定义由事件绑定或菜单项调用的操作。类（或实例）变量定义绑定和菜单添加；当扩展链接到编
辑窗口时，这些由 IDLE 自动应用。

IDLE 扩展类使用单个参数“editwin”（一个 EditorWindow 实例）进行实例化。扩展不能对这个参数做太多假设，但保证有以下实例变量：

    text	一个 Text 实例（一个小部件）
    io		一个 IOBinding 实例（稍后会详细介绍）
    flist	FileList 实例（由所有编辑窗口共享）

（还有一些，但它们很少有用。）

扩展类不能直接绑定窗口管理器（例如 X）事件。相反，它必须定义一个或多个虚拟事件，例如<<zoom-height>>，以及相应的方法
，例如zoom_height_event()。虚拟事件将绑定到相应的方法，然后窗口管理器事件可以绑定到虚拟
事件。 （完成此间接操作是为了可以轻松更改键绑定，并且可以存在其他虚拟事件源，例如菜单条目。）

扩展可以定义菜单项。这是通过名为 menudefs 的类或实例变量完成的；它应该是一个对的列表，其中每对是一个菜单名称（小写）和一个菜单条目列表。每个菜单
条目要么是 None （插入分隔符条目）要么是一对字符串（menu_label、virtual_event）。其中，menu_label为菜
单项的标签，virtual_event为该项被选中时产生的虚拟事件。删除菜单标签中的下划线；下划线后面的字符显示为下划线，以指示快捷方式字符
（对于 Windows）。

目前，扩展无法定义全新的菜单；它们必须在现有菜单中定义条目。某些窗口上不存在某些菜单；这样的条目定义将被忽略，但仍
然应用键绑定(这可能在将来需要改进。）

扩展不需要为它们实现的所有事件定义菜单项。 （它们也不需要创建键绑定，但在这种情况下，cofig-extensions.def 中必须有空绑定）

这是一个完整的例子：

class ZoomHeight:

    menudefs = [
        ('edit', [
            None, # Separator
            ('_Zoom Height', '<<zoom-height>>'),
         ])
    ]

    def __init__(self, editwin):
        self.editwin = editwin

    def zoom_height_event(self, event):
        "...在这里做你想做的..."

最后一块拼图是文件“config-extensions.def”，它用于配置扩展的加载并建立与扩展中定义的虚拟事件的键（或更一般地，事件）绑定。

有关信息，请参阅 config-extensions.def 顶部的注释。当前需要手动修改该文件以更改 IDLE 的扩展加载或扩展键绑定。

有关绑定的更多信息，请参阅 python.org 上的 Tkinter 资源网页和 Tk 命令“绑定”手册页。
