私はこの質問が何度も聞かれてきましたが、答えを閲覧した後、何がうまくいかないのか分からないようです。Pyinstallerが "-1を返しました"
私はPythonスクリプト(下記)を持っており、Pyinstallerを使用して実行可能ファイルにしています(私はWindows上にあります)。
私は私のPlot.pyファイルのディレクトリにいるとき、私は、コマンドプロンプトに入力します。
pyinstaller.exe --onefile --windowed Plot.py
それはその後、成功したexeファイルを作成しますが、私はそれを開こうとすると、ウィンドウのポップ「致命的なエラー! "Plot returned -1"と表示されます。
PythonスクリプトからPyinstallerを使用する前に、TkinterとtkFileDialogを使用して実行可能ファイルを作成しました。私が調査したところから、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ファイルの作品を言及する必要があります。
私はコードが少し工夫されていることを知っていますが、それは私がそれが私がそれが必要なもののために働くようにしたい正確に動作します。 sys.exit()
ておきexit()
またはquit()
またはos._exit()
を交換する
おっと、ごめんなさい、窓の下で走っているのを気付かなかった。このstrace analogを試してみて、結果を投稿してください。 - http://msdn.microsoft.com/en-us/library/windows/hardware/ff552060(v=vs.85).aspx – Samuel
pyinstallerを '--windowed'なしで実行するとコマンドラインでの完全なエラートレースバック。 – codewarrior
@codewarrior良いアイデア!私は "ImportError:FixTkという名前のモジュールはありません" – Joe