构建成功,但是代码不起作用,抛出ImportError

时间:2018-08-02 03:40:57

标签: python tkinter build site-packages

我的问题与WEB上的现有问题几乎没有什么不同。让我尝试突出显示它。我有this代码,可以通过读取指定的.txt文件来做一些绘图。我将像往常一样构建它。我的 setup.py 应该可以完成这项工作。 setup.py的内容为here

如您所见,在上述两个文件中我都没有与 tkinter 相关的软件包。我在终端机上做了python setup.py build,执行得很好。但是不能在Windows命令脚本中使用我的实际代码

build\\exe.win-amd64-3.5\\draw_precision_recall_curve.exe D:\dataset\Fire_Smoke\Train\filelist.txt 
 pause 

它引发了此踪迹:

Traceback (most recent call last):
  File "C:\python354\lib\site-packages\cx_Freeze\initscripts\__startup__.py", line 14, in run
    module.run()
  File "C:\python354\lib\site-packages\cx_Freeze\initscripts\Console.py", line 26, in run
    exec(code, m.__dict__)
  File "draw_precision_recall_curve.py", line 3, in <module>
    import matplotlib.pyplot as plt
  File "C:\python354\lib\site-packages\matplotlib\pyplot.py", line 115, in <module>
    _backend_mod, new_figure_manager, draw_if_interactive, _show = pylab_setup()
  File "C:\python354\lib\site-packages\matplotlib\backends\__init__.py", line 62, in pylab_setup
    [backend_name], 0)
  File "C:\python354\lib\site-packages\matplotlib\backends\backend_tkagg.py", line 4, in <module>
    from . import tkagg  # Paint image to Tk photo blitter extension.
  File "C:\python354\lib\site-packages\matplotlib\backends\tkagg.py", line 5, in <module>
    from six.moves import tkinter as Tk
  File "C:\python354\lib\site-packages\six.py", line 92, in __get__
    result = self._resolve()
  File "C:\python354\lib\site-packages\six.py", line 115, in _resolve
    return _import_module(self.mod)
  File "C:\python354\lib\site-packages\six.py", line 82, in _import_module
    __import__(name)
ImportError: No module named 'tkinter'

在这里和那里的相关文章中,我无法解决此问题。 任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

您可能没有使用tkinter,但是您正在使用matplotlib,并且它使用了tkinter

实际上,matplotlib给您a choice of backends。但是IIRC,如果您尚未安装可选的Win32本机后端,则默认为Windows上的tkinter(或者可能是TkAgg,它使用tkinter),并且始终在非Mac Unix上

所以:

  • 如果您仅以非图形方式使用matplotlib(例如,生成要保存的文件),请明确指定非交互式后端。
  • 如果使用它来显示图形,则需要将tkinter捆绑在您的应用程序中,或者选择其他交互式后端并将那个捆绑在您的应用程序中。

例如,假设您只想生成一堆图形为PNG文件。您可以使用TkAgg非交互式后端,而不是通过默认的AGG后端来这样做,就像这样:

import matplotlib
matplotlib.use('AGG')
import matplotlib.pyplot as plt