IDLE

源代码: Lib/idlelib/


IDLE 是 Python 所内置的开发与学习环境。

IDLE 具有以下特性:

  • 编码于 100% 纯正的 Python,使用名为 tkinter 的图形用户界面工具

  • 跨平台:在 Windows、Unix 和 macOS 上工作近似。

  • 提供输入输出高亮和错误信息的 Python 命令行窗口 (交互解释器)

  • 提供多次撤销操作、Python 语法高亮、智能缩进、函数调用提示、自动补全等功能的多窗口文本编辑器

  • 在多个窗口中检索,在编辑器中替换文本,以及在多个文件中检索(通过 grep)

  • 提供持久保存的断点调试、单步调试、查看本地和全局命名空间功能的调试器

  • 配置、浏览以及其它对话框

编辑和导航

编辑窗口

IDLE 可以在启动时打开编辑器窗口,这取决于选项设置和你启动 IDLE 的方式。 在此之后,请使用 File 菜单。 对于给定的文件只能打开一个编辑器窗口。

标题栏包含文件名称、完整路径,以及运行该窗口的 Python 和 IDLE 版本。 状态栏包含行号 ('Ln') 和列号 ('Col')。 行号从 1 开始;列号则从 0 开始。

IDE 会定扩展名为 .py* 的文件包含 Python 代码而其他文件不包含。 可使用 Run 菜单来运行 Python 代码。

按键绑定

在本节中,'C' 是指 Windows 和 Unix 上的 Control 键,以及 macOS 上的 Command 键。

  • Backspace 向左删除; Del 向右删除

  • C-Backspace 向左删除单词; C-Del 向右删除单词

  • 方向键和 Page Up/Page Down 移动

  • C-LeftArrowC-RightArrow 按字移动

  • Home/End 跳转到行首/尾

  • C-Home/C-End 跳转到文档首/尾

  • 一些有用的Emacs绑定是从Tcl / Tk继承的:

    • C-a 行首

    • C-e 行尾

    • C-k 删除行(但未将其放入剪贴板)

    • C-l 将插入点设为窗口中心

    • C-b 后退一个字符而不删除该字符(通常你也可以用方向键进行此操作)

    • C-f 前进一个字符而不删除该字符(通常你也可以用方向键进行此操作)

    • C-p 向上一行(通常你也可以用方向键进行此操作)

    • C-d 删除下一个字符

标准的键绑定(例如 C-c 复制和 C-v 粘贴)仍会有效。 键绑定可在配置 IDLE 对话框中选择。

自动缩进

在一个代码块开头的语句之后,下一行会缩进 4 个空格符(在 Python Shell 窗口中是一个制表符)。 在特定关键字之后(break, return 等),下一行将不再缩进。 在开头的缩进中,按 Backspace 将会删除 4 个空格符。 Tab 则会插入空格符(在 Python Shell 窗口中是一个制表符),具体数量取决于缩进宽度。 目前,Tab 键按照 Tcl/Tk 的规定设置为四个空格符。

另请参阅 Format 菜单 的缩进/取消缩进区的命令。

完成

Completions are supplied for functions, classes, and attributes of classes, both built-in and user-defined. Completions are also provided for filenames.

The AutoCompleteWindow (ACW) will open after a predefined delay (default is two seconds) after a '.' or (in a string) an os.sep is typed. If after one of those characters (plus zero or more other characters) a tab is typed the ACW will open immediately if a possible continuation is found.

If there is only one possible completion for the characters entered, a Tab will supply that completion without opening the ACW.

'Show Completions' will force open a completions window, by default the C-space will open a completions window. In an empty string, this will contain the files in the current directory. On a blank line, it will contain the built-in and user-defined functions and classes in the current namespaces, plus any modules imported. If some characters have been entered, the ACW will attempt to be more specific.

If a string of characters is typed, the ACW selection will jump to the entry most closely matching those characters. Entering a tab will cause the longest non-ambiguous match to be entered in the Editor window or Shell. Two tab in a row will supply the current ACW selection, as will return or a double click. Cursor keys, Page Up/Down, mouse selection, and the scroll wheel all operate on the ACW.

"Hidden" attributes can be accessed by typing the beginning of hidden name after a '.', e.g. '_'. This allows access to modules with __all__ set, or to class-private attributes.

Completions and the 'Expand Word' facility can save a lot of typing!

Completions are currently limited to those in the namespaces. Names in an Editor window which are not via __main__ and sys.modules will not be found. Run the module once with your imports to correct this situation. Note that IDLE itself places quite a few modules in sys.modules, so much can be found by default, e.g. the re module.

If you don't like the ACW popping up unbidden, simply make the delay longer or disable the extension.

提示

A calltip is shown when one types ( after the name of an accessible function. A name expression may include dots and subscripts. A calltip remains until it is clicked, the cursor is moved out of the argument area, or ) is typed. When the cursor is in the argument part of a definition, the menu or shortcut display a calltip.

A calltip consists of the function signature and the first line of the docstring. For builtins without an accessible signature, the calltip consists of all lines up the fifth line or the first blank line. These details may change.

The set of accessible functions depends on what modules have been imported into the user process, including those imported by Idle itself, and what definitions have been run, all since the last restart.

For example, restart the Shell and enter itertools.count(. A calltip appears because Idle imports itertools into the user process for its own use. (This could change.) Enter turtle.write( and nothing appears. Idle does not import turtle. The menu or shortcut do nothing either. Enter import turtle and then turtle.write( will work.

In an editor, import statements have no effect until one runs the file. One might want to run a file after writing the import statements at the top, or immediately run an existing file before editing.

代码上下文

在一个包含 Python 代码的编辑器窗口内部,可以切换代码上下文以便显示或隐藏窗口顶部的面板。 当显示时,此面板可以冻结代码块的开头行,例如以 class, defif 关键字开头的行,这样的行在不显示时面板时可能离开视野。 此面板的大小将根据需要扩展和收缩以显示当前层级的全部上下文,直至达到配置 IDLE 对话框中所定义的最大行数(默认为 15)。 如果如果没有当前上下文行而此功能被启用,则将显示一个空行。 点击上下文面板中的某一行将把该行移至编辑器顶部。

上下文面板的文本和背景颜色可在配置 IDLE 对话框的 Highlights 选项卡中进行配置。

Python Shell 窗口

通过 IDLE 的 Shell 可以输入、编辑和召回整条语句。 大部分控制台和终端在同一时刻只能处理单个物理行。

当向 Shell 粘贴代码时,它并不会被编译和执行,直到按下 Return 键。 在此之前可以先编辑所粘贴的代码。 如果向 Shell 粘贴了多行代码,多条语句会被当作一条语句来编译,结果将引发 SyntaxError

之前小节中描述的编辑功能在交互式地输入代码时也可使用。 IDLE 的 Shell 窗口还会响应以下按键。

  • C-c 中断执行命令

  • C-d 发送文件结束命令;如果在 >>> 提示符后按下会关闭窗口。

  • Alt-/ (扩展单词) 也有助于减少输入量

    历史命令

    • Alt-p 提取与你所输入键匹配的前一条命令。 在 macOS 上请使用 C-p

    • Alt-n 提取下一条命令。 在 macOS 上请使用 C-n

    • 在任意的前一条命令上按 Return 将提取该命令

文本颜色

IDLE 文本默认为白底黑字,但有特殊含义的文本将以彩色显示。 对于 Shell 来说包括 Shell 输出,Shell 错误,用户输出和用户错误。 对于 Shell 提示符下或编辑器中的 Python 代码来说则包括关键字,内置类和函数名称,classdef 之后的名称,字符串和注释等。 对于任意文本窗口来说则包括光标(如果存在)、找到的文本(如果可能)和选定的文本。

广西着色是在背景上完成的,因此有时会看到非着色的文本。 要改变颜色方案,请使用配置 IDLE 对话框的高亮选项卡。 编辑器中的调试器断点行标记和弹出面板和对话框中的文本则是用户不可配置的。

启动和代码执行

在附带 -s 选项启用的情况下,IDLE 将会执行环境变量 IDLESTARTUPPYTHONSTARTUP 所引用的文件。 IDLE 会先检查 IDLESTARTUP;如果 IDLESTARTUP 存在则会运行被引用的文件。 如果 IDLESTARTUP 不存在,则 IDLE 会检查 PYTHONSTARTUP。 这些环境变量所引用的文件是存放经常被 IDLE Shell 所使用的函数,或者执行导入常用模块的 import 语句的便捷场所。

此外,Tk 也会在存在启动文件时加载它。 请注意 Tk 文件会被无条件地加载。 此附加文件名为 .Idle.py 并且会在用户的家目录下查找。 此文件中的语句将在 Tk 的命名空间中执行,所以此文件不适用于导入要在 IDLE 的 Python Shell 中使用的函数。

命令行语法

idle.py [-c command] [-d] [-e] [-h] [-i] [-r file] [-s] [-t title] [-] [arg] ...

-c command  run command in the shell window
-d          enable debugger and open shell window
-e          open editor window
-h          print help message with legal combinations and exit
-i          open shell window
-r file     run file in shell window
-s          run $IDLESTARTUP or $PYTHONSTARTUP first, in shell window
-t title    set title of shell window
-           run stdin in shell (- must be last option before args)

如果有参数:

  • 如果使用了 -, -cr,则放在 sys.argv[1:...]sys.argv[0] 中的所有参数都会被设为 '', '-c''-r'。 不会打开任何编辑器窗口,即使是在选项对话框中的默认设置。

  • 在其他情况下,参数为要打开编辑的文件而 sys.argv 反映的是传给 IDLE 本身的参数。

启动失败

IDLE uses a socket to communicate between the IDLE GUI process and the user code execution process. A connection must be established whenever the Shell starts or restarts. (The latter is indicated by a divider line that says 'RESTART'). If the user process fails to connect to the GUI process, it displays a Tk error box with a 'cannot connect' message that directs the user here. It then exits.

导致连接失败的一个常见原因是用户创建的文件与标准库模块同名,例如 random.pytkinter.py。 当这样的文件与要运行的文件位于同一目录中时,IDLE 将无法导入标准库模块。 可用的解决办法是重命名用户文件。

虽然现在已不太常见,但杀毒软件或防火墙程序也有可能会阻止连接。 如果无法将此类程序设为允许连接,那么为了运行 IDLE 就必须将其关闭。 允许这样的内部连接是安全的,因为数据在外部端口上不可见。 一个类似的问题是错误的网络配置阻止了连接。

Python 的安装问题有时会使 IDLE 退出:存在多个版本时可能导致程序崩溃,或者单独安装时可能需要管理员权限。 如果想要避免程序崩溃,或是不想以管理员身份运行,最简单的做法是完全卸载 Python 并重新安装。

有时会出现 pythonw.exe 僵尸进程问题。 在 Windows 上,可以使用任务管理员来检查并停止该进程。 有时由程序崩溃或键盘中断(control-C)所发起的重启动可能会出现连接失败。 关闭错误提示框或使用 Shell 菜单中的 Restart Shell 可能会修复此类临时性错误。

当 IDLE 首次启动时,它会尝试读取 ~/.idlerc/ 中的用户配置文件(~ 是用户的家目录)。 如果配置有问题,则应当显示一条错误消息。 除随机磁盘错误之外,此类错误均可通过不手动编辑这些文件来避免。 请使用 Options 菜单来打开配置对话框。 一旦用户配置文件出现错误,最好的解决办法就是删除它并使用配置对话框重新设置。

如果 IDLE 退出时没有发出任何错误消息,并且它不是通过控制台启动的,请尝试通过控制台或终端 (python -m idlelib) 来启动它以查看是否会出现错误消息。

运行用户代码

With rare exceptions, the result of executing Python code with IDLE is intended to be the same as executing the same code by the default method, directly with Python in a text-mode system console or terminal window. However, the different interface and operation occasionally affect visible results. For instance, sys.modules starts with more entries, and threading.activeCount() returns 2 instead of 1.

在默认情况下,IDLE 会在单独的 OS 进程中运行用户代码而不是在运行 Shell 和编辑器的用户界面进程中运行。 在执行进程中,它会将 sys.stdin, sys.stdoutsys.stderr 替换为从 Shell 窗口获取输入并向其发送输出的对象。 保存在 sys.__stdin__, sys.__stdout__sys.__stderr__ 中的原始值不会被改变,但可能会为 None

当 Shell 获得焦点时,它将控制键盘与屏幕。 这通常会保持透明,但一些直接访问键盘和屏幕的函数将会不起作用。 这也包括那些确定是否有键被按下以及是哪个键被按下的系统专属函数。

IDLE 的标准流替换不会被执行进程中创建的子进程所继承,不论它是由用户代码直接创建还是由 multiprocessing 之类的模块创建的。 如果这样的子进程使用了 input 获取 sys.stdin 或者使用了 printwrite 输出到 sys.stdout 或 sys.stderr,则应当在命令行窗口中启动 IDLE。 这样二级子进程将会被附加到该窗口进行输出和输出。

在执行进程中运行的 IDLE 代码会向调用栈添加在其他情况下不存在的帧。 IDLE 包装了 sys.getrecursionlimitsys.setrecursionlimit 以减少额外栈帧的影响。

如果 sys 被用户代码重置,例如使用了 importlib.reload(sys),则 IDLE 的修改将丢失,来自键盘的输入和向屏幕的输出将无法正确运作。

当用户代码直接或者通过调用 sys.exit 引发 SystemExit 时,IDLE 将返回 Shell 提示符而非完全退出。

Shell中的用户输出

当一个程序输出文本时,结果将由相应的输出设备来确定。 当 IDLE 执行用户代码时,sys.stdoutsys.stderr 会被连接到 IDLE Shell 的显示区。 它的某些特性是从底层的 Tk Text 部件继承而来。 其他特性则是程序所添加的。 总之,Shell 被设计用于开发环境而非生产环境运行。

例如,Shell 绝不会丢弃输出。 一个向 Shell 发送无限输出的程序将最终占满内存,导致内存错误。 作为对比,某些系统文本模式窗口只会保留输出的最后 n 行。 例如,Windows 控制台可由用户设置保留 1 至 9999 行,默认为 300 行。

A Tk Text widget, and hence IDLE's Shell, displays characters (codepoints) in the BMP (Basic Multilingual Plane) subset of Unicode. Which characters are displayed with a proper glyph and which with a replacement box depends on the operating system and installed fonts. Tab characters cause the following text to begin after the next tab stop. (They occur every 8 'characters'). Newline characters cause following text to appear on a new line. Other control characters are ignored or displayed as a space, box, or something else, depending on the operating system and font. (Moving the text cursor through such output with arrow keys may exhibit some surprising spacing behavior.)

>>> s = 'a\tb\a<\x02><\r>\bc\nd'  # Enter 22 chars.
>>> len(s)
14
>>> s  # Display repr(s)
'a\tb\x07<\x02><\r>\x08c\nd'
>>> print(s, end='')  # Display s as is.
# Result varies by OS and font.  Try it.

repr 函数会被用于表达式值的交互式回显。 它将返回输入字符串的一个修改版本,其中的控制代码、部分 BMP 码位以及所有非 BMP 码位都将被替换为转义代码。 如上面所演示的,它使用户可以辨识字符串中的字符,无论它们会如何显示。

普通的与错误的输出通常会在与代码输入和彼此之间保持区分 (显示于不同的行)。 它们也会分别使用不同的高亮颜色。

对于 SyntaxError 回溯信息,表示检测到错误位置的正常 '^' 标记被替换为带有代表错误的文本颜色高亮。 当从文件运行的代码导致了其他异常时,用户可以右击回溯信息行在 IDLE 编辑器中跳转到相应的行。 如有必要将打开相应的文件。

Shell 具有将输出行折叠为一个 'Squeezed text' 标签的特殊功能。 此功能将自动应用于超过 N 行的输出 (默认 N = 50)。 N 可以在设置对话框中 General 页的 PyShell 区域中修改。 行数更少的输出也可通过在输出上右击来折叠。 此功能适用于过多的输出行数导致滚动操作变慢的情况。

已折叠的输出可通过双击该标签来原地展开。 也可通过右击该标签将其发送到剪贴板或单独的查看窗口。

开发 tkinter 应用程序

IDLE 有意与标准 Python 保持区别以方便 tkinter 程序的开发。 在标准 Python 中输入 import tkinter as tk; root = tk.Tk() 不会显示任何东西。 在 IDLE 中输入同样的代码则会显示一个 tk 窗口。 在标准 Python 中,还必须输入 root.update() 才会将窗口显示出来。 IDLE 会在幕后执行同样的方法,每秒大约 20 次,即每隔大约 50 毫秒。 下面输入 b = tk.Button(root, text='button'); b.pack()。 在标准 Python 中仍然不会有任何可见的变化,直到输入 root.update()

大多数 tkinter 程序都会运行 root.mainloop(),它通常直到 tk 应用被销毁时才会返回。 如果程序是通过 python -i 或 IDLE 编辑器运行的,则 >>> Shell 提示符将直到 mainloop() 返回时才会出现,这时将结束程序的交互。

当通过 IDLE 编辑器运行 tkinter 程序时,可以注释掉 mainloop 调用。 这样将立即回到 Shell 提示符并可与正在运行的应用程序交互。 请记得当在标准 Python 中运行时重新启用 mainloop 调用。

在没有子进程的情况下运行

By default, IDLE executes user code in a separate subprocess via a socket, which uses the internal loopback interface. This connection is not externally visible and no data is sent to or received from the Internet. If firewall software complains anyway, you can ignore it.

如果创建套接字连接的尝试失败,IDLE 将会通知你。 这样的失败可能是暂时性的,但是如果持续存在,问题可能是防火墙阻止了连接或某个系统配置错误。 在问题得到解决之前,可以使用 -n 命令行开关来运行 IDLE。

如果 IDLE 启动时使用了 -n 命令行开关则它将在单个进程中运行并且将不再创建运行 RPC Python 执行服务器的子进程。 这适用于 Python 无法在你的系统平台上创建子进程或 RPC 套接字接口的情况。 但是,在这种模式下用户代码没有与 IDLE 本身相隔离。 而且,当选择 Run/Run Module (F5) 时运行环境也不会重启。 如果你的代码已被修改,你必须为受影响的模块执行 reload() 并重新导入特定的条目 (例如 from foo import baz) 才能让修改生效。 出于这些原因,在可能的情况下最好还是使用默认的子进程来运行 IDLE。

3.4 版后已移除.

帮助和偏好

帮助资源

Help 菜单项 "IDLE Help" 会显示标准库参考中 IDLE 一章的带格式 HTML 版本。 这些内容放在只读的 tkinter 文本窗口中,与在浏览器中看到的内容类似。 可使用鼠标滚轮、滚动条或上下方向键来浏览文本。 或是点击 TOC (Table of Contents) 按钮并在打开的选项框中选择一个节标题。

Help 菜单项 "Python Docs" 会打开更丰富的帮助源,包括教程,通过 docs.python.org/x.y 来访问,其中 'x.y' 是当前运行的 Python 版本。 如果你的系统有此文档的离线副本 (这可能是一个安装选项),则将打开这个副本。

选定的 URL 可以使用配置 IDLE 对话框的 General 选项卡随时在帮助菜单中添加或移除。

偏好设定

The font preferences, highlighting, keys, and general preferences can be changed via Configure IDLE on the Option menu. Non-default user settings are saved in a .idlerc directory in the user's home directory. Problems caused by bad user configuration files are solved by editing or deleting one or more of the files in .idlerc.

On the Font tab, see the text sample for the effect of font face and size on multiple characters in multiple languages. Edit the sample to add other characters of personal interest. Use the sample to select monospaced fonts. If particular characters have problems in Shell or an editor, add them to the top of the sample and try changing first size and then font.

On the Highlights and Keys tab, select a built-in or custom color theme and key set. To use a newer built-in color theme or key set with older IDLEs, save it as a new custom theme or key set and it well be accessible to older IDLEs.

macOS 上的IDLE

Under System Preferences: Dock, one can set "Prefer tabs when opening documents" to "Always". This setting is not compatible with the tk/tkinter GUI framework used by IDLE, and it breaks a few IDLE features.

扩展

IDLE contains an extension facility. Preferences for extensions can be changed with the Extensions tab of the preferences dialog. See the beginning of config-extensions.def in the idlelib directory for further information. The only current default extension is zzdummy, an example also used for testing.