PDA

View Full Version : [Python] ottenere path dopo wx.FileDialog


red.hell
07-04-2009, 15:22
sto preparando una gui per il metodo di minimizzazione evolutivo dove avevo già chiesto lumi in questa discussione (http://www.hwupgrade.it/forum/showthread.php?t=1955819)

sto cercando di utilizzare wxPython, poichè mi sembra più bello di TKinter e ma comunque più semplice di PyQT o di GTK

sto preparando una finestra con vari tab, il primo tab è dedicato all'input dei file necessari per la simulazione

sono riuscito a gestire l'evento di pressione del pulsante "sfoglia" per scegliere il file ed a scrivere in un wx.TextCtrl il path del file

se cerco però di "esportare" il path nella classe di livello superiore (quella che gestisce tutti i tab, non quella che gestisce solo il primo tab) me lo esporta prima che la variabile sia riempita

il file dopo devo caricarlo e controllarlo se è strutturato nel modo giusto

dovrei per cui fare vedere quella variabile (il print è solo per mostrare un uso della variabile che non faccia crashare il codice) dopo che sia stato scelto il file

import wx
import os, sys

class principale(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: principale.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
notebook_1 = wx.Notebook(self, -1, style=0)
notebook_1_pane_2 = wx.Panel(notebook_1, -1)
notebook_1_pane_1 = wx.Panel(notebook_1, -1)
notebook_1_pane_3 = wx.Panel(notebook_1, -1)
notebook_1.AddPage(scelta_file(notebook_1), "Primo")
notebook_1.AddPage(notebook_1_pane_2, "Secondo")
notebook_1.AddPage(notebook_1_pane_3, "Terzo")
self.SetSize((500, 500))
self.Layout()
print scelta_file.PathFile

class scelta_file(wx.NotebookPage):
def __init__(self, parent):
wx.NotebookPage.__init__(self, parent, -1)
self.panel = wx.Panel(self, -1)

vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add((-1, 5))

st1 = wx.StaticText(self.panel, -1, 'File elementi')
vbox.Add(st1, 0, wx.RIGHT, 8)

vbox.Add((-1, 5))

hbox1=wx.BoxSizer(wx.HORIZONTAL)
self.tc = wx.TextCtrl(self.panel, -1)
hbox1.Add(self.tc, 1, wx.EXPAND)
sfoglia1=wx.Button(self.panel, 1, 'Sfoglia')
hbox1.Add(sfoglia1,0)
vbox.Add(hbox1,0, wx.EXPAND)
self.Bind(wx.EVT_BUTTON, self.openfile, id=1)

vbox.Add((-1, 10))

self.panel.SetSizer(vbox)
self.panel.Fit()

def openfile(self, event):
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wx.OPEN)

if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
self.PathFile="%s" % path
self.tc.AppendText("%s" % path)

dlg.Destroy()

def fineopenfile(self,event):
print "ci provo"
pathfile=self.tc.GetValue()
for line in file(pathfile):
mat[ii,:]=map(float, line.split())
ii=ii+1

print mat
print 'chiuso'

def PathFile(self):
pass

# end of class principale
if __name__ == '__main__':
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
principale = principale(None, -1, "Finestra principale")
app.SetTopWindow(principale)
principale.Show()
app.MainLoop()

grazie per l'aiuto :)

red.hell
08-04-2009, 16:36
in un modo, abbastanza osceno, ho risolto, sono andato a sfruttare un oggetto creato e inizializzato nel main dove dopo andavo a sostituire i valori

ora però ho un'altro problema, una volta presi i file (o meglio, un file, solo il primo) non riesco a mostrarne il contenuto nel secondo tab in modo efficente

per mostrarlo ho dovuto preparare un pulsante che lo mostri, altrimenti in automatico non mostrava nulla

solo che l'evento di questo pulsante devo metterlo in una funzione, e usando la funzione il .Add ad un BoxSizer non capisce cosa c'è prima e va a sovrascrivere tutto

di seguito il codice, in allegato il .txt da caricare (deve avere n righe e 11 colonne)

import wx
import os, sys
import numpy as np

class variabili():
pass

class principale(wx.Frame):
def __init__(self, *args, **kwds):
# begin wxGlade: principale.__init__
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
notebook_1 = wx.Notebook(self, -1, style=0)
notebook_1_pane_2 = wx.Panel(notebook_1, -1)
notebook_1_pane_1 = wx.Panel(notebook_1, -1)
notebook_1_pane_3 = wx.Panel(notebook_1, -1)
var=variabili()
var.elementi=[]
var.cuscinetti=[]
var.fondazioni=[]
notebook_1.AddPage(scelta_file(notebook_1), "Primo")
notebook_1.AddPage(scelta_parametri(notebook_1), "Secondo")
notebook_1.AddPage(notebook_1_pane_3, "Terzo")

self.SetSize((500, 500))
self.Layout()

class scelta_file(wx.NotebookPage):
def __init__(self, parent):
wx.NotebookPage.__init__(self, parent, -1)
self.panel = wx.Panel(self, -1)

vbox = wx.BoxSizer(wx.VERTICAL)
vbox.Add((-1, 5))

st1 = wx.StaticText(self.panel, -1, 'File elementi')
vbox.Add(st1, 0, wx.RIGHT, 8)

vbox.Add((-1, 5))

self.hbox1=wx.BoxSizer(wx.HORIZONTAL)
self.tc_el = wx.TextCtrl(self.panel, -1)
self.hbox1.Add(self.tc_el, 1, wx.EXPAND)
sfoglia1=wx.Button(self.panel, 1, 'Sfoglia')
self.hbox1.Add(sfoglia1,0)
vbox.Add(self.hbox1,0, wx.EXPAND)
self.Bind(wx.EVT_BUTTON, self.openfile_elementi, id=1)

vbox.Add((-1, 10))

st1 = wx.StaticText(self.panel, -1, 'File fondazioni')
vbox.Add(st1, 0, wx.RIGHT, 8)

hbox1=wx.BoxSizer(wx.HORIZONTAL)
self.tc_fond = wx.TextCtrl(self.panel, -1)
hbox1.Add(self.tc_fond, 1, wx.EXPAND)
sfoglia1=wx.Button(self.panel, 2, 'Sfoglia')
hbox1.Add(sfoglia1,0)
vbox.Add(hbox1,0, wx.EXPAND)
self.Bind(wx.EVT_BUTTON, self.openfile_fondazioni, id=2)

vbox.Add((-1, 10))

st1 = wx.StaticText(self.panel, -1, 'File cuscinetti')
vbox.Add(st1, 0, wx.RIGHT, 8)

hbox1=wx.BoxSizer(wx.HORIZONTAL)
self.tc_cusc = wx.TextCtrl(self.panel, -1)
hbox1.Add(self.tc_cusc, 1, wx.EXPAND)
sfoglia1=wx.Button(self.panel, 3, 'Sfoglia')
hbox1.Add(sfoglia1,0)
vbox.Add(hbox1,0, wx.EXPAND)
self.Bind(wx.EVT_BUTTON, self.openfile_cuscinetti, id=3)

carica=wx.Button(self.panel,4,'Carica e testa i file')
vbox.Add((-1,50))
vbox.Add(carica,0, wx.CENTER)
self.Bind(wx.EVT_BUTTON, self.carica_file, id=4)

self.panel.SetSizer(vbox)
self.panel.Fit()

def openfile_elementi(self, event):
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wx.OPEN)

if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
self.tc_el.AppendText("%s" % path)
# self.hbox1.Add(wx.StaticText(self.panel, -1, 'File elementi'),0)

dlg.Destroy()

def openfile_fondazioni(self, event):
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wx.OPEN)

if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
self.tc_fond.AppendText("%s" % path)

dlg.Destroy()

def openfile_cuscinetti(self, event):
dlg = wx.FileDialog(self, "Choose a file", os.getcwd(), "", "*.*", wx.OPEN)

if dlg.ShowModal() == wx.ID_OK:
path = dlg.GetPath()
mypath = os.path.basename(path)
self.tc_cusc.AppendText("%s" % path)

dlg.Destroy()

def carica_file(self, event):
path_elem=self.tc_el.GetValue()
path_cusc=self.tc_cusc.GetValue()
path_fond=self.tc_fond.GetValue()

file_elem=open(path_elem)
n_linee=sum([1 for line in file_elem])
mat=np.zeros([n_linee,11])
print mat.shape
ii=0
for line in file(path_elem):
mat[ii,:]=map(float, line.split())
ii=ii+1

var.elementi= mat

class scelta_parametri(wx.NotebookPage):
def __init__(self, parent):
wx.NotebookPage.__init__(self, parent, -1)
self.panel2 = wx.Panel(self, -1)
self.vbox = wx.BoxSizer(wx.VERTICAL)
carica=wx.Button(self.panel2,4,'Carica e testa i file')
self.vbox.Add(carica,0, wx.CENTER)
self.vbox.Add((-1,10))
self.vbox2=wx.BoxSizer(wx.VERTICAL)
self.Bind(wx.EVT_BUTTON, self.plot_valori, id=4)
self.panel2.SetSizer(self.vbox)
self.panel2.Fit()

def plot_valori(self,event):
self.vbox2.Destroy()
self.Layout()
hbox=wx.BoxSizer(wx.HORIZONTAL)
hbox.Add(wx.StaticText(self.panel2, -1, str(var.elementi)) ,1)
self.vbox2=wx.BoxSizer(wx.VERTICAL)
self.vbox2.Add(hbox, 0)
self.vbox2.Add((-1, 5))

if __name__ == '__main__':
var=variabili()
var.elementi=[]
var.cuscinetti=[]
var.fondazioni=[]
app = wx.PySimpleApp(0)
wx.InitAllImageHandlers()
principale = principale(None, -1, "Finestra principale")
app.SetTopWindow(principale)
principale.Show()

app.MainLoop()