2016-07-27 8 views
0

Je suis en train de développer une application utilisant Python 3.4 et PyQt4 avec LiClipse comme IDE et j'ai un problème avec les graphes de traçage fermant l'ensemble du programme sans erreur après avoir compilé le programme dans un exécutable. J'ai identifié la zone à problème et je sais que l'appel à matplotlib.figure.Figure() est le coupable, mais je ne sais pas où aller à partir d'ici.EXE avec des plantages MatplotLib

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) 

Mon script d'installation py2exe produit un exécutable utilisable pour toutes les fonctions, sauf lorsqu'un graphique est initialisé sur la page:

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 
     ) 

Je suis en mesure d'exécuter toutes les autres fonctions de mon application dans le fichier exécutable, mais sans problème. Aucune erreur visible n'est affichée et l'application fonctionne correctement avant la compilation.

Nous vous remercions de votre aide.

+0

Un [mcve] serait utile. Par exemple, l'ensemble setup.py dirait si 'data_files = matplotlib.get_py2exe_datafiles()' est présent comme dans [answer] (http://stackoverflow.com/a/11062854/5781248) –

+0

@JJHakala, j'ai mis à jour le script d'installation. J'utilise data_files = matplotlib.get_py2exe_datafiles() –

Répondre

0

Mon dépannage trouvé numpy.core pour être le coupable de mon problème. J'ai réinstallé numpy et l'exécutable s'exécute correctement maintenant.