Pyinstaller"返回-1"

时间:2016-03-30 03:24:27

标签: python matplotlib pyinstaller

我知道这个问题之前已被多次询问,但在浏览答案后,我似乎无法弄清楚出了什么问题。

我有一个python脚本(下面),我正在尝试使用Pyinstaller将其变成可执行文件(我在Windows上)。

当我在Plot.py文件的目录中时,输入命令提示符:

pyinstaller.exe --onefile --windowed Plot.py

然后它成功创建了exe文件,但当我尝试打开它时,弹出一个标题为“#34;致命错误!”的窗口。说" Plot返回-1"。

在使用Tkinter和tkFileDialog从python脚本使用Pyinstaller之前,我已经制作了可执行文件。根据我的研究,Pyinstaller支持matplotlib。

任何想法出了什么问题?

Plot.py如下:

'''
Plot.py
Opens a GUI and allows users to select text files with five columns: x, y, z, t, e
Then, it makes two graphs and shows them - x vs y vs z and e vs t
'''

from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
import tkFileDialog
from Tkinter import *

def get_name_from_file(path):
    '''
    takes a path and returns just the name of the file
    i.e. C:/Users/joe.iosue/Documents/helloworld.txt returns helloworld.txt
    '''
    while path.count("/") > 0:
        i = path.index("/")
        path = path[i+1:]
    return path

def make_plot(x, y, z, title):
    '''
    returns a plt object that can be saved to show later
    x, y, z are lists of floats, but the 0th index is a string: the title of that axes.
    title is a string
    '''
    fig = plt.figure()
    #If there is no z list, the graph should only be 2d (energy vs time)
    if z != None:
        plot = fig.add_subplot(111, projection='3d')
        plot.set_zlabel(z[0])
        plot.scatter(x[1:], y[1:], z[1:], c='r', marker='o')
        plot.set_xlabel(x[0])
        plot.set_ylabel(y[0])
        plot.set_zlabel(z[0])
    else:
        plt.plot(x[1:], y[1:], c='r', marker='o')
        plt.xlabel(x[0])
        plt.ylabel(y[0])
    plt.title(title)
    return plt

class Graph(object):
    '''
    Reads from a file that has 5 columns: x, y, z, t, KE
    There are two graphs: a position graph (x, y, z)
    and a Kinetic energy vs Time graph (t, KE)
    '''
    def __init__(self, filename, xlabel='X', ylabel='Y', zlabel='Z', tlabel='t', elabel='KE', title='Title'):
        self.title = title
        f = open(filename, 'r')
        data = f.readlines()
        f.close()
        #first index of the lists are what I am going to name the axes
        self.xList, self.yList, self.zList, self.tList, self.eList = [xlabel], [ylabel], [zlabel], [tlabel], [elabel]
        lines = []
        for element in data:
            lines.append(element.split())
        for element in lines:
            #In case I decide later to add comments in my text file with the points
            #I added this try statement so it won't add a comment to the point lists
            try:
                self.xList.append(float(element[0]))
                self.yList.append(float(element[1]))
                self.zList.append(float(element[2]))
                self.tList.append(float(element[3]))
                self.eList.append(float(element[4]))
            except:
                pass
    def plot_position(self):
        make_plot(self.xList, self.yList, self.zList, self.title).show()
    def plot_energy(self):
        make_plot(self.tList, self.eList, None, self.title).show()
    def plot_both(self):
         '''
         matplotlib works in global frame, so this makes both plots
         (x vs y vx z and ke vs t) in global frame and then shows both
         at the same time
         '''
         make_plot(self.xList, self.yList, self.zList, self.title)
         make_plot(self.tList, self.eList, None, self.title).show()

class OpenDialogMenu(object):
    '''
    opens file menu only allowing text files to be chosen
    '''
    def __init__(self, master):
        self.master = master
        self.file_options = options = {}
        options['defaultextension'] = '.txt'
        options['filetypes'] = [('TXT files', '.txt')]
        options['initialdir'] = 'C:\Documents'
        options['parent'] = self.master
        options['title'] = 'Open File Menu'
        self.filename = tkFileDialog.askopenfile(mode="r", **self.file_options)
    def get_filename(self):
        '''
        If user opens file menu and then closes it without picking
        a file, should return None
        '''
        try:
            return self.filename.name
        except:
            return None

class Home(object):
    '''
    master is a Tk window
    Home can store multiple text files ready to plot
    '''
    def __init__(self, master):
        self.master = master
        self.master.title('Plot')
#       In case the icon file is not in the correct directory
        try:
            self.master.wm_iconbitmap("ploticon.ico")
        except:
            pass
        self.open= Button(self.master, text='Open', command=self.Open, width=10)
        self.plot = Button(self.master, text='Plot', command=self.Plot, width=10)
        self.plot.grid(row=0, column=0)
        self.open.grid(row=0, column=1)
        self.row = 1
        self.files, self.labels = [], []

        self.menubar = Menu(self.master)
        self.filemenu = Menu(self.menubar, tearoff=0)
        self.menubar.add_cascade(label="File", menu=self.filemenu)
        self.filemenu.add_command(label="New", command=self.New)
        self.filemenu.add_command(label="Open", command=self.Open)
        self.filemenu.add_command(label="Reset", command=self.delete_files)
        self.filemenu.add_separator()
        self.filemenu.add_command(label="Exit", command=self.master.destroy)
        self.master.config(menu=self.menubar)

        self.master.bind('<Control-o>', self.Open)
        self.master.bind('<Return>', self.Plot)
        self.master.bind('<Control-n>', self.New)
        self.master.bind('<Control-r>', self.delete_files)

    def Open(self, callback=False):
        '''
        opens the open dialog menu and adds the chosen file to self.files
        and adds a label to the window with name of file
        '''
        f = OpenDialogMenu(self.master)
        self.filename = f.get_filename()
        if self.filename != None:
            name = get_name_from_file(self.filename)
            self.labels.append(Label(self.master, text=name))
            self.labels[len(self.labels)-1].grid(row=self.row, columnspan=50)
            self.row+=1
            self.files.append(Graph(filename=self.filename, title=name))

    def Plot(self, callback=False):
        '''
        plots plt objects
        '''
        for element in self.files:
            element.plot_both()

    def New(self, callback=False):
        '''
        opens new tkinter window with Home attributes
        '''
        root = Tk()
        Home(root)
        root.mainloop()

    def delete_files(self, callback=False):
        '''
        removes all files from file and label list
        '''
        for element in self.labels:
            element.destroy()
        self.labels = []
        self.files = []    

if __name__ == '__main__':
    root = Tk()
    Home(root)
    root.mainloop()

我应该提一下,py文件可以工作。

我知道这些代码有点人为,但它的确如此,我希望它能够满足我的需要。

1 个答案:

答案 0 :(得分:0)

尝试替换每个exit()quit()os._exit()sys.exit() ...我看到你的代码中没有任何这些,但是其他人可能会觉得这很有用......希望它有所帮助:)

myinfo:python3.4,pyinstaller3.1.1