使用MatplotLib的EXE崩溃

时间:2016-07-27 12:49:40

标签: python matplotlib py2exe

我正在使用Python 3.4和PyQt4开发一个使用LiClipse作为IDE的应用程序,并且在我将程序编译成可执行文件之后绘制关闭整个程序的图形而没有错误的问题。我已经指出了问题区域,并且知道调用matplotlib.figure.Figure()是崩溃的罪魁祸首,但我不知道从哪里开始。

import matplotlib
from matplotlib.backends.backend_qt4agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure
class GraphWidget(FigureCanvas):
    def __init__(self,parent=None,width = 500, height = 600, dpi = 100):

        self.width = width/dpi
        self.height = height/dpi
        self.dpi = dpi

        #================crashes here=============#
        self.figure = Figure((self.width,self.height), dpi=self.dpi)
        #=========================================#

        alert = QMessageBox()
        alert.setText("Passed Figure()")
        alert.exec_()

        FigureCanvas.__init__(self,self.figure)
        alert = QMessageBox()
        alert.setText("Passed super init")
        alert.exec_()

        self.canvas = self
        self.axis = self.figure.add_subplot(111)
        self.setSizePolicy(QSizePolicy.Expanding,QSizePolicy.Expanding)
        self.parent = parent

    def set_new_graph(self,data,labels):
        self.layoutVert = QVBoxLayout(self)
        size = QSize(self.width*self.dpi,self.height*self.dpi)

        self.axis.hold(False)

        mined = min(data.totalamount) - round(min(data.totalamount)*.1,0)
        if mined > 0: mined = 0
        maxed = max(data.totalamount) + round(max(data.totalamount)*.1,0)
        if maxed == mined: maxed += 5 

        data.plot(x = data.totalamount
                  , ax = self.axis
                  , kind = 'bar'
                  , rot=0
                  , legend = False
                  , sharex = True
                  , sharey = True
#                 , xticks = labels
                  , ylim = (mined,maxed)
                  , table = False)
#         self.axis.set_ylim(mined,maxed)
        self.axis.set_xticklabels(labels, fontsize = 'small')

        self.axis.set_title("Sales History over Past Year")
        self.canvas.draw()
        self.resize(size)
        self.layoutVert.addWidget(self.canvas)

我的py2exe安装脚本为所有函数生成可用的可执行文件,除非在页面上初始化图形:

mpld = matplotlib.get_py2exe_datafiles()
include = ['sip','pandas','reportlab'
         , 'PyQt4'
         , 'PyQt4.QtGui'
         , 'PyQt4.QtCore'
         , 'PyQt4.Qt'
         ,'reportlab.rl_settings','scipy','win32com'
         ,'win32com.client'
         , 'matplotlib'
         , 'matplotlib.backends'
         , 'matplotlib.backends.backend_qt4agg'
         , 'matplotlib.figure'
         ]

exclude = ['nbformat','win32com.gen_py',"six.moves.urllib.parse",
    '_gtkagg', '_tkagg', '_agg2', 
    '_cairo', '_cocoaagg',
    '_fltkagg', '_gtk', '_gtkcairo']

setup(name="ServiceMgmt",
        # console based executables
        console=[],

        # windows subsystem executables (no console)
        windows=['ServiceMgmt.py'],

        # py2exe options
        #zipfile=None,
        options={"py2exe": py2exe_options},
        data_files=mpld
        )

我可以在可执行文件中运行我的应用程序的所有其他功能但没有问题。没有显示可见错误,应用程序在编译之前工作正常。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

我的故障排除发现numpy.core是我的问题的罪魁祸首。我重新安装了numpy,现在可执行文件正常运行。