Forum >> Programmazione Python >> GUI >> Problema a salvare un file di interi

Pagina: 1

Salve ho il seguente problema: non riesco a creare un file che salvi una lista

di interi.

app.values = app.freqa + app.mixa + app.freqb + app.mixb
        if not self._model:
            name = simpledialog.askstring('Nome modello', 'inserire il nome da assegnare', parent=self)
            if not name:
                return
            self._model = os.path.join(self._cache, name + '.json')
        if os.path.exists(self._model):
            msg = 'Nome modello già in uso'
            messagebox.showerror('Duplicazione', msg, parent=self)
            return
        for k in self._scales.keys():
            sets = []
            for i in range(len(self._scalesk)):
                sets.append(self._scalesk.get())
            app.valuesk = sets
        try:
            with open(self._model, 'w') as f:
                json.dump(app.values, f)
        except OSError as e:
            msg = 'Errore salvataggio dati mixer:\n\n' + repr(e)
            messagebox.showerror('Errore I/O', msg, parent=self)
Aiutatemi a capire cos' è andato storto per favore. :angry:
Ciao caro, dunque proviamo a vedere qualche punto insieme.

Secondo me qui ci sono 3 cose da verificare prima di tutto:

-- Tipi dei dati json.dump vuole roba serializzabile: la tua app.values è davvero lista di int? (prova: print(type(app.values), app.values[:5]))

-- Refusi/indici in quel blocco ci sono self._scalesk e app.valuesk: volevi dire self._scalesk e magari salvare in una struttura per chiave? Stai chiamando .get() sul widget giusto o sulla lista?

-- Percorso file la cartella self._cache esiste quando apri il file? (se no: os.makedirs(self._cache, exist_ok=True))Se vuoi testare l’I/O isolato (senza Tk/interfaccia), prova solo questo micro-test:
import json

open("test.json","w").write(json.dumps([1,2,3]))

Fai sapere se trovi la strada.

Cya
Daniele aka Palmux said @ 2025-10-24 11:01:08:
import json

open("test.json","w").write(json.dumps([1,2,3]))
Il test ha funzionato quindi è un problema di chiavi ma non capisco dove.


Ti invio il sorgente completo così capisci.

get() è su lista a quanto pare.



Sono riuscito a mettere a posto il comando save:

 def _on_save(self):
        app.values = app.freqa + app.mixa + app.freqb + app.mixb
        print(app.values)
        if not self._model:
            name = simpledialog.askstring('Nome modello', 'inserire il nome da assegnare', parent=self)
            if not name:
                return
            self._model = os.path.join(self._cache, name + '.json')
        if os.path.exists(self._model):
            msg = 'Nome modello già in uso'
            messagebox.showerror('Duplicazione', msg, parent=self)
            return
        for k in self._scales.keys():
            sets = []
            for i in range(len(self._scalesk)):
                sets.append(self._scalesk.get())
            #app.valuesk = sets
        try:
            with open(self._model, 'w') as f:
                json.dump(app.values, f)
        except OSError as e:
            msg = 'Errore salvataggio dati mixer:\n\n' + repr(e)
            messagebox.showerror('Errore I/O', msg, parent=self)
            return

Dimmi che te ne pare.
Ho tolto
#app.valuesk = sets
e mi salva il modello su file.

--- Ultima modifica di fabio75 in data 2025-10-24 21:18:06 ---

--- Ultima modifica di fabio75 in data 2025-10-24 21:18:50 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:50:49 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:51:04 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:51:51 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:52:14 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:52:34 ---

--- Ultima modifica di fabio75 in data 2025-10-26 06:53:09 ---
Allegati
Mi da errore quì:

def _on_open(self):
sets = []
model = select_model(self, self._cache)
if not model: return
self._model = os.path.join(self._cache, model + '.json')
try:
with open(self._model) as f:
app.values = json.load(f)
except OSError as e:
msg = 'Errore salvataggio dati mixer:\n\n' + repr(e)
messagebox.showerror('Errore I/O', msg, parent=self)
return
for k in self._scales.keys():
for i in range(len(self._scalesk)):
print(app.values)
self._scalesk.set(app.values) #mi da errore quì





Aiutami a capire che cosa c' è che non va, errore:

1500
Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/media/fabio/6CA2E3C5A2E3923E/Progetti con eagle/SINTHETIZER/SOFTWARE/PC/prova.py", line 294, in _on_open
    self._scalesk.set(app.values)
AttributeError: 'list' object has no attribute 'set'





RISOLTO

  self._scalesk.set(app.values)






Era un problema di indici.








--- Ultima modifica di fabio75 in data 2025-10-26 08:25:28 ---

--- Ultima modifica di fabio75 in data 2025-10-26 08:26:13 ---
Ora però mi succede una cosa strana con il codice allegato:

Se carico con open() modello1 funziona e mi setta gli sliders,

mentre se carico modello2 mi da il seguente errore:

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python3.10/tkinter/__init__.py", line 1921, in __call__
    return self.func(*args)
  File "/media/fabio/6CA2E3C5A2E3923E/Progetti con eagle/SINTHETIZER/SOFTWARE/PC/prova.py", line 292, in _on_open
    self._scalesk.set(app.values)
  File "/usr/lib/python3.10/tkinter/__init__.py", line 3507, in set
    self.tk.call(self._w, 'set', value)
_tkinter.TclError: expected floating-point number but got "1500 1500 1500 1500 1500"

infine se carico modello3 mi funziona lo stesso e mi mette gli sliders tutti a 0 come previsto dal file modello3.

Carico i tre modelli più il sorgente.

Fammi sapere.









Allegati
Fabio, nel modello2 app.values contiene più numeri in una stringa (“1500 1500 1500…”), ma .set() accetta un solo float.

Controlla, se devi gestire più slider, fai un ciclo su ciascun valore; se ne hai solo uno, prendi il primo numero della stringa.

Prova e fai sapere se era quello il problema.


Pagina: 1



Esegui il login per scrivere una risposta.