【问题标题】:Importing from a Package in IDLE vs Shell从 IDLE 与 Shell 中的包导入
【发布时间】:2016-12-12 21:34:00
【问题描述】:

导入整个包在 IDLE 中有效,但在 shell 中无效。以下在 IDLE 中可以正常工作:

import tkinter as tk
tk.filedialog.askopenfilename()

在 shell 中,我得到这个错误:

AttributeError: 'module' object has no attribute 'filedialog'

我知道我必须 import tkinter.filedialog 才能在 shell 中完成这项工作。

为什么IDLE和shell有区别?我怎样才能让 IDLE 像 shell 一样?让脚本在 IDLE 中运行而在 shell 中失败可能会令人沮丧。

我正在使用 Python 3.4。

【问题讨论】:

  • @TerryJanReedy 是的,那篇文章描述了一个类似的问题。脚本环境不应该与 IDLE 用于其自身需求的任何东西隔离开来吗?另外,如果我在 IDLE 中输入tkintertk,它会显示name 'tkinter' is not definedname 'tk' is not defined,如果其他帖子中的解释正确,则应该定义它。
  • 我撤回了关闭请求,因为您问的不是“为什么”,而是“如何解决”。我在下面回答了。是的,脚本环境应该尽可能地隔离。这就是在单独的进程中执行代码的原因。 IDLE 文档有一个 3.2 部分。 IDLE - 列出一些不可避免的控制台差异。我仍在努力将 sys.modules 中的额外模块数量减少到最低限度。 (bugs.python.org/issue27534)。对我来说,当前的减少将 run.py 中的导入时间减少了 45%。

标签: python python-import python-idle python-packaging


【解决方案1】:

这是我为未来的 3.5.3 和 3.6.0a4 版本修复的 IDLE 错误。 Tracker issue.

对于现有的 3.5 或 3.4 版本,将以下内容添加到 idlelib/run.py 的 LOCALHOST 行之前。

for mod in ('simpledialog', 'messagebox', 'font',
            'dialog', 'filedialog', 'commondialog',
            'colorchooser'):
    delattr(tkinter, mod)
    del sys.modules['tkinter.' + mod]

我认为这适用于早期的 3.x 版本,但没有安装它们进行测试。对于现有的 3.6.0a_ 版本,将 'colorchooser' 替换为 'ttk'。

【讨论】:

  • 特里,感谢您维护 IDLE。我真的很喜欢将 IDE 与编程语言打包在一起的想法。这使得部署在您很少使用的机器上变得很容易。您是否有幸找到了我在 stackoverflow.com/questions/32551405/… 中询问的 CPU 使用率的解决方案?我仍然无法弄清楚触发它的模式是什么,它不会一直发生。
  • 感谢您的积极反馈。
猜你喜欢
  • 2011-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
  • 1970-01-01
  • 1970-01-01
  • 2018-02-09
  • 2017-07-01
相关资源
最近更新 更多