【问题标题】:EXE with MatplotLib Crashes带有 MatplotLib 的 EXE 崩溃
【发布时间】:2016-07-27 12:49:39
【问题描述】:

我正在使用 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
        )

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

感谢您的帮助。

【问题讨论】:

  • minimal reproducible example 会很有用。例如,整个 setup.py 将判断 data_files=matplotlib.get_py2exe_datafiles() 是否存在,如 answer
  • @J.J.Hakala,我已经更新了设置脚本。我确实使用 data_files=matplotlib.get_py2exe_datafiles()

标签: python matplotlib py2exe


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-02-19
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    相关资源
    最近更新 更多