【问题标题】:Script fails with AttributeError when run in CMD, but executes fine in IDLE脚本在 CMD 中运行时出现 AttributeError 失败,但在 IDLE 中执行正常
【发布时间】:2015-04-06 23:14:37
【问题描述】:

我很新很困惑。我尝试了一个带有 tkinter 的简单脚本,它在 IDLE 中运行良好,但是当我尝试从 CMD 启动它时 - tkinter 窗口打开并且看起来不错,但是当您尝试单击任何按钮或文件菜单选项时,会引发 AttributeError:

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
return self.func(*args)
  File "060214_Manual_Evaluation_of_Protein-protein_Cross-Links.py", line 13, in Open_csv
  self.CsvPath = tk.filedialog.askopenfilename()
  AttributeError: 'module' object has no attribute 'filedialog'

感谢您提供的任何意见或在哪里可以找到有关 IDLE 和 CMD 之间差异的更多信息。

【问题讨论】:

  • 检查你正在使用的 python 版本... Cmd 似乎正在使用 Py2 和 IDLE Py3。先检查版本。
  • 感谢您的回答!版本是一样的,我查过了。
  • 在给出下面的答案后,我认为这是 IDLE 的一个错误,它掩盖了一旦直接在 Python 中运行代码就会变得可见的错误。该修复程序将在 3.5.3 中,并且已经在当前的 3.6.0 版本中。修复后,import tkinter; tkinter.filedialog 在 IDLE 中运行时会失败,就像在控制台中运行时一样。

标签: python cmd python-idle


【解决方案1】:

人们询问 python 版本是因为 tk.filedialog 在 2.x 中拼写不同。但是,我怀疑您的问题是 Idle 在托管环境中运行代码,这掩盖了未正确导入 tkinter.filedialog 的未发布代码中的错误。为了说明,以下来自标准的 3.4.2 控制台解释器

>>> import tkinter as tk
>>> tk.filedialog
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'filedialog'

下面是 Idle 的 Shell 中的相同语句。

>>> import tkinter as tk
>>> tk.filedialog
<module 'tkinter.filedialog' from 'C:\\Programs\\Python34\\lib\\tkinter\\filedialog.py'>

之所以没有报错是因为Idle已经将filedialog子模块导入为tkinter.filedialog(在sys.modules中)。如果这也是您的问题,您的解决方案是在下面添加导入并引用不带“tk”前缀的“filedialog”。

>>> from tkinter import filedialog
>>> filedialog
<module 'tkinter.filedialog' from 'C:\\Programs\\Python34\\lib\\tkinter\\filedia
log.py'>
>>> filedialog.askopenfilename
<function askopenfilename at 0x0000000000498BF8>

如果这不能解决此问题,请编辑您的问题以添加一个真正最小的代码示例,并准确说明您如何使用 Idle 和“CMD”运行(这是 Windows 上的 cmd.exe,还是什么?)。

【讨论】:

  • 非常感谢,当我单独导入子模块时它可以工作。我不知道这是正确的做法。
【解决方案2】:

这看起来像 IDLE 设置了不同的 PYTHONPATH,或者使用了不同的 python 可执行文件;通过检查两者的sys.version_info 并比较sys.path,确保使用相同版本的python。

【讨论】:

  • 感谢您的回答!我这样做了,唯一的区别是从空闲我得到了一个额外的路径 - 'C:\\Python33\\Lib\\idlelib'。
  • 嗯,那条路径包含什么有趣的东西吗?根据sys.version_info?,两个python都是python3.3
  • 我现在正在浏览它,但由于我几乎不了解 python 的工作原理,因此无法真正说出有趣的地方。是的,版本完全一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-20
  • 1970-01-01
  • 2012-11-29
  • 1970-01-01
  • 2013-11-29
相关资源
最近更新 更多