Bu soruyu daha önce defalarca sordum, ama cevaplara göz attıktan sonra neyin yanlış gittiğini anlayamıyorum.Pyinstaller "-1 döndü"
Bir python betiğim var (aşağıda) ve bir yürütülebilir dosyaya dönüştürmek için Pyinstaller'ı kullanmaya çalışıyorum (pencerelerdeyim).
benim Plot.py dosyasının dizinde duyuyorum
, ben komut satırına yazın:pyinstaller.exe --onefile --windowed Plot.py
Daha sonra başarıyla exe dosyası oluşturur, ama bir pencere pops açmaya çalıştığınızda "Ölümcül Hata!" başlıklı başlık Bu "Arsa -1 döndü" diyor.
Pyinstaller'ı Tytter ve tkFileDialog kullanarak python komut dosyalarından kullanmadan önce yürütülebilir dosyaları yaptım. Araştırma yaptığımdan Pyinstaller matplotlib'i destekliyor.
Herhangi bir fikir yanlış giden nedir?
Plot.py aşağıdaki gibidir:
'''
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()
belirtmek gerekir, py dosyası çalışır.
Kodun biraz karmaşık olduğunu biliyorum, ancak tam olarak ne yapmam gerektiği için çalışmasını istiyorum.
Hata! Üzgünüz, pencereler altında çalıştığınızı fark etmediniz. Bu strace benzerini deneyin ve sonuçları kaydedin - http://msdn.microsoft.com/en-us/library/windows/hardware/ff552060(v=vs.85).aspx – Samuel
"--windowed" olmadan pyinstaller çalıştırın Komut satırında tam bir hata izleme. – codewarrior
@codewarrior İyi fikir! "ImportError: FixTk adlı bir modül yok" aldım – Joe