Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - nuzzopippo

Pagine: [1] 2 3 ... 29
1
ValueError: I/O operation on closed file.

Il problema in citazione è dato dallo statement with ed indica la necessità di approfondire le basi del linguaggio innanzi tutto : quanto un file viene aperto tramite "with" viene chiuso non appena concluso il blocco di codice sottoposto a detto statement.

Il secondo errore è dato da una errata indentazione ... prima di misurarti con 150.000 righe dati (diciamo che anche io ci starei attento) Ti suggerirei di approfondire il linguaggio e di non procedere a tentativi, leggi approfonditamente la documentazione di ciò che vuoi utilizzare.

Per altro, posto un file "precipitazioni.csv" contenente i dati nel Tuo esempio
NzP:~$ cat precipitazioni.csv
code,datetime,temperature,smlp,rh,wind_speed,wind_direction,wind_gust,rain_rate,daily_rain,dew_point,rad,uv
lig063,31/12/2019 23:05,5.60,1032.8,67,1.60,0.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:10,5.40,1032.7,67,0.00,0.00,1.60,0.00,0.00,-0.20,,
lig063,31/12/2019 23:15,5.40,1032.6,67,0.00,0.00,1.60,0.00,0.00,-0.30,,
lig063,31/12/2019 23:20,5.30,1032.6,67,0.00,0.00,3.20,0.00,0.00,-0.30,,
lig063,31/12/2019 23:25,5.40,1032.6,67,1.60,0.00,6.40,0.00,0.00,-0.30,,
lig063,31/12/2019 23:30,5.50,1032.7,67,0.00,270.00,3.20,0.00,0.00,-0.10,,
lig063,31/12/2019 23:35,5.50,1032.7,66,1.60,0.00,4.80,0.00,0.00,-0.40,,
NzP:~$ cat dealy_rayn_lig063.csv
cat: dealy_rayn_lig063.csv: File o directory non esistente
NzP:~$


Puoi estrarre la colonna 9, diciamo nel file "dealy_rayn_lig063.csv" (che poi non è considerabile propriamente un csv) così:
>>> f_inp_name = 'precipitazioni.csv'
>>> f_out_name = 'dealy_rayn_lig063.csv'
>>> try:
f_inp = open(f_inp_name, 'r')
f_out = open(f_out_name, 'w')
for row in f_inp.readlines():
data = row.split(',')
f_out.write(data[9] + '\n')
except Exception as e:
print('Avvenuto errore:\n%s' % repr(e))
finally:
f_inp.close()
f_out.close()


11
5
5
5
5
5
5
5
>>>

avresti :
NzP:~$ cat dealy_rayn_lig063.csv
daily_rain
0.00
0.00
0.00
0.00
0.00
0.00
0.00
NzP:~$

2
Un esempio dei dati da trattare e di cosa vuoi ottenere?

... Poi, un delimtatore nullo non mi sembra una grande idea e nei futuri post utilizza il pulsante "pythoncode" dell'editor per formattare il codice.

3
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 15, 2021, 07:35 »
Ottima cosa, la libertà ...  aspetto di vedere come "modelli" il Tuo ultimo quesito .

N.B. - le tecniche le hai già nel codice trattato ;)

4
Base / Re:Calcoli da lista da file in lettura
« il: Aprile 15, 2021, 07:32 »
A prescindere dalla organizzazione del codice (molto migliorabile), lo OP fa già la conversione dei dati in float ... credo che il punto si trovi sul "cosa" siano quei dati letti, basta una riga vuota per avere l'errore

Esempio : sia mean.txt
NzP:~$ cat mean.txt
1.0
1.15
1.30

2.25
1.09
NzP:~$


Leggendo e convertendo avremo
>>> with open('mean.txt') as f:
data = f.readline()
while data:
d = float(data)
print(d)
data = f.readline()


1.0
1.15
1.3
Traceback (most recent call last):
  File "<pyshell#13>", line 4, in <module>
    d = float(data)
ValueError: could not convert string to float: ''
>>>


Suggerirei di controllare i files dati.

[Edit] mi era sfuggito in prima lettura ... bisogna stare attenti con "readline()", non è che riconosca che i dati nel file sono finiti, devi effettuare un controllo su ciò che è stato letto oppure alterare la logica dello script (readlines() è una buona soluzione alternativa)

5
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 13, 2021, 08:51 »
Ciao @marioma

Grazie @nuzzopippo, sto facendo qualche test "sul campo" e finora il risultato è soddisfacente con tutti i documenti che ho utilizzato.
Stavo pensando una cosa, è possibile selezionare tutte le righe ed importarle nella text box in basso in modo massivo, oppure bisogna procedere riga per riga?

Si, è possibile.
Come detto in precedenza, devi considerare una applicazione come creta, la modelli come vuoi, a patto di sapere cosa si voglia fare e come farla.


Cerchiamo di migliorare il progetto perchè mi sembra davvero interessante  :D  ;)

È qualcosa di vicino alla "idea" cui ho accennato un paio di post fa, personalmente manipolo parecchio i pdf sul lavoro, non utilizzo, però, python, ma la linea di comando linux, in quel s.o. vi sono parecchi tools molto efficaci per fare più o meno tutto ciò che si vuole.

Anche python offre molti tools in merito ai pdf, forse anche troppi, l'idea che avevo in mente è proporre a Te ed a eventuali altri "aspiranti apprendisti" interessati (in cui ricado anche io) di tudiarci e discutere sull'argomento senza fretta e senza ben precise finalità, provando varie librerie e soluzioni e raffinando, nel tempo, gli approcci adottati ... un percorso di studio comune, di fondo.

Per quanto mi riguarda, quando ho un po' di tempo sto già cercando di affrontare tale faccenda, partendo dalla considerazione che molti dei documenti che tratto sono in realtà scansioni, quindi immagini, che su linux tratto tramite imagemagick e tesseract ... ho idea di replicare ciò che faccio con python, sotto linux al momento (non ho sistemi windows disponibili), al momento mi sto costruendo un viewer a singola pagina di documento pdf, al momento sono sulla interfacci utente, che inizialmente è in tkinter e successivamente proverò a farlo con le wx, quando completerò l'interfaccia che voglio realizzare proverò varie librerie per formare l'immagine ed estrarre il testo, tanto in modalità ocr, quanto in modalità "diretta".

Se Tu o altri siete interessati, fatemelo sapere che provvederò a rendere disponibili i vari step e, magari ne discutiamo qui ... ovviamente, nel caso, mi aspetto che gli "interessati" mettano "del loro", tanto come idee quanto come soluzioni alternative
 ... se poi, ci fosse qualche esperto ad indicare le (certamente tante) pecche, sarebbe il massimo ;)

Ciao.

6
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 11, 2021, 09:38 »
Allora @marioma86, come promesso ho implementato le due "varianti" richieste, il codice è di 376 righe, puoi trovarlo qua assieme a qualche striminzita spiegazione, è minimale come gestione ma permette di eliminare colonne dati e sostituire il separatore con la tabulazione codificata in carattere utf esadecimale a 32 bit, attento a quest'ultimo particolare (leggiti lo How-To) se utilizzi windows (e quindi codifica windows-1252") avrai errore a meno che non codifichi l'intero file in utf o non utilizzi altra codificha alternativa del carattere.

Se ritieni di implementare una versione utilizzante knime, quando la fai fatti sentire, io sono sempre curioso.

Ciao

7
Esercizi / Re:pseudocodice prima e ultima cifra in un numero
« il: Aprile 09, 2021, 16:57 »
...
Invece, senza la tua spiegazione non avrei pensato di usare log in questo modo.
Sono dovuto tornare a vedermi la definizione di logaritmo. :embarrassed:
Esattamente ciò che ho fatto a mia volta, saranno passati quarant'anni dall'ultima volta che ho utilizzato i logaritmi.

...
Fantastico, ti ringrazio ancora una volta, il tuo intervento è stato illuminante.
Spero che la domanda che ho fatto non ti abbia infastidito essendo una domanda da super nabbo
Ho avuto la fortuna di incontrare, in questo Forum, utenti molto capaci, che purtroppo ora si vedono poco, che mi hanno permesso di intravedere schemi di approccio e di pensiero più efficaci di quelli che uso di solito, per quanto posso cerco di restituire ciò che mi è stato regalato.
Per altro, io approfitto delle Vostre domande per guardare in direzioni "diverse" che magari non vedrei nel mio iter quotidiano, perciò nessun fastidio, piacere, ivece, se riesco a combinare qualcosa di positivo.

Ciao :)

8
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 09, 2021, 16:48 »
Per migliorare eventualmente il progetto volevo chiederti se, secondo te, fosse possibile una volta definite le righe da importare nel csv, scegliere anche quali colonne eventualmente eliminare (perchè non serve indicarle nel csv) e scegliere, eventualmente, come delimitatore la tabulazione.
...
Pensi che possano essere delle modifiche fattibili?

Per quanto riguarda le colonne è fattibilissimo con modeste modifiche al precedente esempio, così come "penso" sia semplice definire la tabulazione quale delimitatore ... per quest'ultimo puno ho da consultare la docs, però, è un particolare problema che non mi son mai posto (tendo a non complicarmi la vita, perché affrontare "problemi di codifica" quando posso evitarli?)

Non conosco Knime, data-science e data-mining sono al di la delle mie (modeste) capacità culturali ma non ho dubbi che possano essere tranquillamente gestite in ambiti GUI ... in fin dei conti, una applicazione è come plastilina nelle mani di un programmatore, può modellarla come vuole, unico limite la sua "manualità".

Se trovo il tempo, e mi riesce, nel fine settimana proverò a realizzare quelle due varianti sulla base di quanto già proposto prima, se realizzo provvederò in qualche modo a rendere disponibile il codice (che certo diventerà eccessivo per un post)

... Ti confesso che mi stai solleticando una qualche "idea", magari, poi, la dico.

Ciao

9
Esercizi / Re:pseudocodice prima e ultima cifra in un numero
« il: Aprile 08, 2021, 17:54 »
...Perché dovrei usare % e log(x, 10)? :embarrassed: e soprattutto come dovrei usarli? non ne trovo l'utilità in un esercizio del genere...

bah ... un "esercizio" serve a farti "vedere" qualcosa, in genere è utile, guarda qua :
>>> import math
>>> num = 2345
>>> num % 10
5
>>> num // 10**(int(math.log10(num)))
2
>>> num = 23456
>>> num % 10
6
>>> num // 10**(int(math.log10(num)))
2
>>>

Comprendilo, poi descrivi i passi necessari per farlo nel Tuo modo ed in quest'altro : alla fine avrai un'idea "nuova" (nel senso che altrimenti non verrebbe da sola)

P.S. : guarda che devi trattare numeri, NON stringhe

10
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 04, 2021, 07:17 »
Il codice è perfetto! Ora sto cercando di modificarlo per fargli leggere un pdf con più di una pagina, visto che questo se non sbaglio permette di leggere file pdf composti da una sola pagina...

... già, tanto perfetto che Ti permette di leggere solo la prima pagina ;) ... è solo uno spunto di esempio buttato li per il Tuo codice, ove, all'istruzione
lines = pdf[0].splitlines()

Dici di leggere la prima pagina

Se vuoi leggerle tutte, modifica la funzione di callback "_sel_file(self):" in questo modo:
    def _sel_file(self):
        f_types =[('File pdf', '*.pdf')]
        try:
            f = fdlg.askopenfile(parent=self,
                                 initialdir = self.init_dir,
                                 title='Selezione PDF',
                                 mode='rb',
                                 filetypes=f_types)
            lines = None
            if f:
                self.init_dir = os.path.dirname(f.name)
                pdf = pdftotext.PDF(f)
                f.close()
                for i in range(len(pdf)):
                    lines = pdf[i].splitlines()
                    if lines:
                        self._set_data(lines)
        except OSError:
            msgb.showerror(title='Apertura fallita', message='Errore lettura file')

Attenzione però, non so cosa succederebbe per pdf molto estesi, forse sarebbe meglio implementare dei "sezionamenti" nei dati da leggere, a poche pagine per volta.

... per quanto riguarda, poi, l'insieme del codice è uno scriptino giusto buttato li, non ho trovato alcuna documentazione sul modulo "pdftotext", quindi non c'è alcuna gestione di eventuali errori nella lettura di pdf mal formattati, poi, come gestirebbe dati stringa (e quindi con spazi interni)?, etc. ... in sostanza, un approccio fatto bene richiederebbe un "modello" molto più consistente e basato su librerie ben documentate, il modello implementato può andare bene giusto per casi ben precisi.

Bene che Tu abbia concetti sulle classi ma non trascurare di approfondire il discorso in python, personalmente ho avuto alcune "sorprese" rispetto al java da cui provenivo.

Ciao e buona pasqua

11
Benvenuto e regolamento / Re:Salve, coders!
« il: Aprile 03, 2021, 12:37 »
"Dylaniator"? ... debbo preoccuparmi? ... ti chiamerò "Dylan" ;)

Ciao @Dylan, ben venuto, magari si impara assieme.

Perché pentito della biologia? La vita è un argomento interessante, e certamente più "stabile" dei bit che di solito si frequentano qui, in permanente mutazione.

Ci leggiamo

12
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Aprile 03, 2021, 12:31 »
Allora, @marioma, come promesso ho fatto un piccolo esempio in tkinter che apre e legge un file PDF (utilizzando il Tuo modo, vedi metodo di callback "_sel_file(self)") permette di impostare il separatore, eliminare le righe non interessanti, elaborare una riga manualmente (pensata per le intestazioni che possono avere spazi in più) e preparare automaticamente blocchi di righe dati (funziona per righe), magari dopo aver corretto qualche imprecisione di lettura, e, in fine, di generare un file csv (non utilizzo la libreria, però).
Per esporre i dati utilizzo due textbox cui è disattivato il ritorno a capo automatico, una serie di pulsanti attivati secondo il contesto permettono le "manipolazioni" se necessarie.

Appena fatto il primo test, sembra funzionare, "potrebbero" anche processarsi più pdf, eliminando l'intero contenuto in self.pdf_text e caricando un altro pdf ed aggiungere i dati, ma questo non lo ho sperimentato.

Spero Tu abbia guardato le classi, perché non vi è alcun aiuto nel codice, troppo grosso anche se è il minimo sindacale, ci vorrebbero molti accorgimenti in più, in ogni caso la documentazione può essere di grande aiuto per ciò che è oscuro e "decifrare" è un ottimo esercizio.

Spero Ti sia utile
# -*- coding: utf-8 -*-

import os
import tkinter as tk
import tkinter.messagebox as msgb
import tkinter.filedialog as fdlg
import pdftotext

class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title('PDF => CSV')
        p_file = tk.Frame(self)
        p_file.grid(row=0, column=0, sticky='ew')
        self.bt_sel_file = tk.Button(p_file, text='Seleziona PDF',
                                     padx=5, pady=5,
                                     command=self._sel_file)
        self.bt_sel_file.grid(row=0, column=0, sticky='ew')
        self.bt_close_file = tk.Button(p_file, text='Chiudi PDF',
                                       padx=5, pady=5,
                                       command=self._close_file)
        self.bt_close_file.grid(row=0, column=1, sticky='ew')
        self.bt_make_csv = tk.Button(p_file, text='Crea CSV',
                                     padx=5, pady=5,
                                     command = self._make_csv)
        self.bt_make_csv.grid(row=0, column=2, sticky='ew')
        self.bt_close = tk.Button(p_file, text='Esci',
                                  padx=5, pady=5,
                                  command=self.destroy)
        self.bt_close.grid(row=0, column=3, sticky='ew')
        p_file.grid_columnconfigure(0, uniform=1, weight=1)
        p_file.grid_columnconfigure(1, uniform=1, weight=1)
        p_file.grid_columnconfigure(2, uniform=1, weight=1)
        p_file.grid_columnconfigure(3, uniform=1, weight=1)
        p_text = tk.Frame(self)
        p_text.grid(row=1, column=0, sticky='nsew')
        lbl = tk.Label(p_text, text='Righe testo estratte dal PDF',
                       justify='left', padx=5, pady=5, anchor='w')
        lbl.grid(row=0, column=0, columnspan=3, sticky='ew')
        self.pdf_text = tk.Text(p_text, height=15, bg='#D5E711',
                                wrap='none', padx=5, pady=5)
        self.pdf_text.grid(row=1, column=0, sticky='nsew')
        v_scr_1 = tk.Scrollbar(p_text, orient=tk.VERTICAL,
                               command=self.pdf_text.yview)
        self.pdf_text.configure(yscrollcommand=v_scr_1.set)
        v_scr_1.grid(row=1, column=1, sticky='ns')
        h_scr_1 = tk.Scrollbar(p_text, orient=tk.HORIZONTAL,
                               command=self.pdf_text.xview)
        self.pdf_text.configure(xscrollcommand=h_scr_1.set)
        h_scr_1.grid(row=2, column=0, sticky='ew')
        p_bt_file = tk.Frame(p_text)
        p_bt_file.grid(row=1, column=2, sticky='ns')
        lbl = tk.Label(p_bt_file, text='Car. separatore:', anchor='w',
                       padx=5, pady=5)
        lbl.grid(row=0, column=0)
        self.e_sep = tk.Entry(p_bt_file, width=3)
        self.e_sep.grid(row=1, column=0)
        self.bt_del_line = tk.Button(p_bt_file, text='Elimina righe',
                                     padx=5, pady=5, command=self._del_select_rows)
        self.bt_del_line.grid(row=3, column=0, sticky='nsew')
        self.bt_trasf_line = tk.Button(p_bt_file, text='Trasferisci riga',
                                       padx=5, pady=5, command=self._data_transfer)
        self.bt_trasf_line.grid(row=4, column=0, sticky='nsew')
        self.bt_elab_lines = tk.Button(p_bt_file, text='Elabora righe',
                                       padx=5, pady=5, command=self._elab_rows)
        self.bt_elab_lines.grid(row=5, column=0, sticky='nsew')
        p_bt_file.grid_rowconfigure(2, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(3, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(4, uniform=2, weight=1)
        p_bt_file.grid_rowconfigure(5, uniform=2, weight=1)
        p_text.grid_columnconfigure(0, weight=1)
        p_text.grid_rowconfigure(1, weight=1)
        p_csv = tk.Frame(self)
        p_csv.grid(row=2, column=0, sticky='nsew')
        lbl = tk.Label(p_csv, text='Righe elaborate per il CSV',
                       justify='left', padx=5, pady=5, anchor='w')
        lbl.grid(row=0, column=0, columnspan=2, sticky='ew')
        self.csv_text = tk.Text(p_csv, height=15, bg='#E7D011',
                                wrap='none', padx=5, pady=5)
        self.csv_text.grid(row=1, column=0, sticky='nsew')
        v_scr_2 = tk.Scrollbar(p_csv, orient=tk.VERTICAL,
                               command=self.csv_text.yview)
        self.csv_text.configure(yscrollcommand=v_scr_2.set)
        v_scr_2.grid(row=1, column=1, sticky='ns')
        h_scr_2 = tk.Scrollbar(p_csv, orient=tk.HORIZONTAL,
                               command=self.csv_text.xview)
        self.csv_text.configure(xscrollcommand=h_scr_2.set)
        h_scr_2.grid(row=2, column=0, sticky='ew')
        p_csv.grid_columnconfigure(0, weight=1)
        p_csv.grid_rowconfigure(1, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.grid_rowconfigure(1, weight=1)
        self.grid_rowconfigure(2, weight=1)

        self.init_dir = os.getenv('HOME')
        self._initialize()

    def _initialize(self):
        self.e_sep.delete(0, 'end')
        self.e_sep.insert(0, ';')
        self.bt_sel_file.configure(state='normal')
        self.bt_close_file.configure(state='disabled')
        self.bt_make_csv.configure(state='disabled')
        self.bt_close.configure(state='normal')
        self.bt_del_line.configure(state='disabled')
        self.bt_trasf_line.configure(state='disabled')
        self.bt_elab_lines.configure(state='disabled')
        self.pdf_text.delete('1.0', 'end')
        self.pdf_text.configure(state='disabled')
        self.csv_text.delete('1.0', 'end')
        self.csv_text.configure(state='disabled')

    def _sel_file(self):
        f_types =[('File pdf', '*.pdf')]
        try:
            f = fdlg.askopenfile(parent=self,
                                 initialdir = self.init_dir,
                                 title='Selezione PDF',
                                 mode='rb',
                                 filetypes=f_types)
            lines = None
            if f:
                self.init_dir = os.path.dirname(f.name)
                pdf = pdftotext.PDF(f)
                f.close()
                lines = pdf[0].splitlines()
            if lines:
                self._set_data(lines)
        except OSError:
            msgb.showerror(title='Apertura fallita', message='Errore lettura file')

    def _set_data(self, data=None):
        if not data: return
        self.pdf_text.configure(state='normal')
        for row in data:
            self.pdf_text.insert('end', row +'\n')
        self.pdf_opened = True
        self._evaluate_state()
   
    def _evaluate_state(self):
        if len(self.pdf_text.get('1.0', 'end-1c')) == 0:
            self.bt_close_file.configure(state='disabled')
            self.bt_del_line.configure(state='disabled')
            self.bt_trasf_line.configure(state='disabled')
            self.bt_elab_lines.configure(state='disabled')
        else:
            self.bt_close_file.configure(state='normal')
            self.bt_del_line.configure(state='normal')
            self.bt_trasf_line.configure(state='normal')
            self.bt_elab_lines.configure(state='normal')
        if len(self.csv_text.get('1.0', 'end-1c')) == 0:
            self.bt_make_csv.configure(state='disabled')
        else:
            self.bt_make_csv.configure(state='normal')

        # endline, endcolumn = text.index('end').split('.')
        # currentline, currentcolum = text.index('current').split('.')
        # self.Text.delete(line_number + '.0', line_number + '.end + 1 char')

    def _get_rows_intervall(self):
        if self.pdf_text.tag_ranges(tk.SEL):
            init_index = self.pdf_text.index(tk.SEL_FIRST)
            end_index = self.pdf_text.index(tk.SEL_LAST)
        else:
            init_index = self.pdf_text.index(tk.INSERT)
            end_index = init_index
        first = int(init_index.split('.')[0])
        last = int(end_index.split('.')[0])
        return [x for x in range(first, last+1)]

    def _del_select_rows(self):
        rows = self._get_rows_intervall()
        if not rows: return
        rows.reverse()
        for n in rows:
            self.pdf_text.delete(str(n)+'.0', str(n)+'.end + 1 char')
        self._evaluate_state()

    def _data_transfer(self):
        current = self.pdf_text.index(tk.INSERT)
        row = current.split('.')[0]
        text = self.pdf_text.get(row + '.0', row + '.end')
        self.csv_text.configure(state='normal')
        self.csv_text.insert('end', text +'\n')
        self.csv_text.configure(state='disabled')
        self.pdf_text.delete(row + '.0', row + '.end + 1 char')
        self._evaluate_state()
   
    def _elab_rows(self):
        rows = self._get_rows_intervall()
        if not rows: return
        sep = self.e_sep.get()
        if len(sep) != 1: return
        if not sep: return
        self.csv_text.configure(state='normal')
        for n in rows:
            text = self.pdf_text.get(str(n)+'.0', str(n)+'.end')
            words = text.split()
            text = sep.join(words)
            self.csv_text.insert('end', text +'\n')
        self.csv_text.configure(state='disabled')
        rows.reverse()
        for n in rows:
            self.pdf_text.delete(str(n)+'.0', str(n)+'.end + 1 char')
        self._evaluate_state()

    def _close_file(self):
        self._initialize()

    def _make_csv(self):
        f_types = [('Comma separed values', '*.csv')]
        f_name = fdlg.asksaveasfilename(parent=self,
                                        initialdir = self.init_dir,
                                        title='Creazione CSV',
                                        confirmoverwrite=False,
                                        filetypes=f_types)
        if not f_name: return
        self.csv_text.configure(state='normal')
        text = self.csv_text.get('1.0', 'end-1c')
        try:
            with open(f_name, 'w') as f:
                f.write(text)
        except OSError:
            msgb.showerror(title='Generazione fallita',
                           message='Errore scrittura file')
            return
        self.csv_text.delete('1.0', 'end')
        self.csv_text.configure(state='disabled')
        self._evaluate_state()


if __name__ == '__main__':
    app = App()
    app.mainloop()

13
Base / Re:classi, attributi
« il: Marzo 31, 2021, 16:31 »
... Inoltre inserendo gli alimenti se possibile non ripetere sempre la parola Cibo....

Mi sa che una guardatina a classi e programmazione ad oggetti la "dovresti" dare @ele, quando le etichette "olio" o "pasta" siano "associate" alla Tua classe "Cibo" esse non fanno altro che definire nello spazio dei nomi delle variabili rappresentanti una istanza alla classe cibo, con le variabili di classe e di istanza correlate, non può utilizzarsi una classe senza che essa sia istanziata, perciò no, la parola "Cibo" non può essere eliminata, in un qualche momento dovrà essere necessariamente invocata.

Per altro puoi accedere tranquillamente alle proprietà dell'oggetto, un esempio, rappresentino i valori da Te definiti i valori per grammo, vogliamo calcolarli per un "piatto" con 100 grammi di pasta e 5 di olio i carboidrati:
>>> class Cibo:
def __init__(self, proteine, carboidrati, grassi):
self.proteine = proteine
self.carboidrati = carboidrati
self.grassi = grassi


>>> olio = Cibo(2, 3, 5)
>>> pasta = Cibo(5, 3, 7)
>>> print(olio.proteine)
2
>>> print(pasta.proteine)
5
>>> piatto = [(olio, 5), (pasta, 100)]
>>> print('Carboidrati nel piatto : %d' % (piatto[0][0].carboidrati * piatto[0][1] +
       piatto[1][0].carboidrati * piatto[1][1]))
Carboidrati nel piatto : 315
>>>

... maniera certamente pessima per utilizzare le classi ma, se fai i conti, i carboidrati saranno "giusti" .... il suggerimento è : studiati le classi

Per quanto riguarda lo "aiuto", non lo nego mai a nessuno ma di tempo ne ho poco (e poi io non sono un gran che e sto tutt'ora imparando), non sostituisco certo un buon libro ;)

14
Progetti e script / Re:Progetto in Python
« il: Marzo 31, 2021, 15:53 »
...Magari è possibile cercare (se esiste) una cartella dove PyCharm ha tutte le librerie installate e crearne un file .zip mettendoci anche il mio programma. Non saprei.

Guarda, ho fatto un "esperimento" : in ufficio mi son creato un venv, lo ho attivato ed installato li pyinstaller, quindi mi son spostato in una directory che contiene un insieme di script da me creati per una necessità di lavoro e dato il comando
pyinstaller --onefile main.py

ove "main.py" rappresenta lo script di avvio della applicazione, quindi mi son copiato da "dist" l'eseguibile prodotto su di una chiavetta usb.

Poco fa ho copiato detto eseguibile sullo HD della macchina da cui scrivo, dato i permessi di esecuzione ed avviato lo script (da shell) e funziona correttamente ... fermo restando che NON è il metodo canonico di distribuire una applicazione Linux (bisognerebbe crearsi un pacchetto, tipo "dep", "rpm" o altro) la cosa "potrebbe" anche funzionare con tale modalità, ti crei un venv, lo attivi, ci installi le librerie che Ti servono e pyinstalle e ti crei lo "eseguibile" direttamente dai sorgenti ... tale modalità è un po' tipo "dare martellate" ma può funzionare ed è sbrigativa.

Chiaramente, può entrare in gioco "anche" la struttura della applicazione da trattare, ed in tal caso diviene necessario studiarsi a fondo la documentazione di pyinstaller, od anche la "modalità" di utilizzo da parte dell'utente finale, ed in quest'altra circostanza possono entrare in gioco tanto la pacchettizzazione della applicazione quanto la sua modalità di utilizzo nel sistema di destinazione (p.e. utilizzo quale daemon, ovvero come applicazione utente) ... dipende un po' dalle Tue finalità l'approfondimento necessario-

15
Tkinter / Re:Associare comando di creazione csv in GUI
« il: Marzo 31, 2021, 08:05 »
Se avrò tempo, nel fine settimana, Ti farò un breve esempio, intanto guardaTi le classi, senza, parlando di GUI, non si va da nessuna parte.

Ciao

Pagine: [1] 2 3 ... 29