Profilo di fabio75

Nome fabio75
Indirizzo email n/a
Messaggi18
  • Re: Problema con lista values[] in programma con GUI
    Forum >> Programmazione Python >> GUI
    Ho corretto gli indici e mi rimangono i due errori sui metodi di aggiornamento di values[].





    --- Ultima modifica di fabio75 in data 2025-10-19 13:54:04 ---
  • Re: Problema con lista values[] in programma con GUI
    Forum >> Programmazione Python >> GUI
    Ho aggiunto altre due righe di oggetti slader e mi succede che se carico con File | open prova1 il modello non viene caricato su values e gli sladers.

    Poi ci sono probabili errori negli indici degli array di "for index in range():"

    nei metodi di aggiornamento, poi mi da errore quando clicco su freq SIDEA e mixer SIDEB mi da 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 267, in aggiorna_mixer
        index = self._scales['mixera'].index(w)
    KeyError: 'mixera'
    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 257, in aggiorna_freq
        index= self._scales['freqsa'].index(w)
    KeyError: 'freqsa'
    
    
    
    Ecco la copia degli errori.
  • Re: Problema con lista values[] in programma con GUI
    Forum >> Programmazione Python >> GUI
    Ecco l'allegato:



  • Problema con lista values[] in programma con GUI
    Forum >> Programmazione Python >> GUI
    Buon giorno, riporto di seguito il codice in cui è dichiarato globalmente

    la lista values[] nella quale vengono messe le variazioni di posizione di 10 sladers.

    Se modifico gli sladers tali variazioni avvengono pure nei valori di values e stampati nella bash mentre se carico da file le posizioni in esso contenute

    tali vari con vengono caricati da files a values[].

    Non capisco perchè dato che values[] è globale non carica le posizioni da file.

    Scusate l'ignoranza con gli oggetti ma non li padroneggio bene.
    import sys
    import os
    import json
    import tkinter as tk
    
    from tkinter import simpledialog
    from tkinter import messagebox
    
    values = [0,0,0,0,0,3300,3300,3300,3300,3300,'0']
    
    class ModelSelector(tk.simpledialog.Dialog):
        ''' Dialog per selezionare modelli di suoni. '''
        def __init__(self, parent, cache):
            self.cache = cache
            self.model = None
            super().__init__(parent, title='Scelta modello')
    
        def body(self, frame):
            self.frame = frame
            self.lst = tk.Listbox(frame)
            self.lst.grid(row=0, column=0, padx=(5,1), pady=5, sticky='nsew')
            vscrol = tk.Scrollbar(frame, orient=tk.VERTICAL,
                                  command=self.lst.yview)
            self.lst.configure(yscrollcommand=vscrol.set)
            vscrol.grid(row=0, column=1, padx=(1,5), pady=5, sticky='ns')
    
            frame.grid_rowconfigure(0, weight=1)
            frame.grid_columnconfigure(0, weight=1)
            self._load_models()
            return frame
    
        def buttonbox(self):
            pn_cmd = tk.Frame(self.frame)
            pn_cmd.grid(row=1, column=0, columnspan=2, sticky='ew')
            bt_ok = tk.Button(pn_cmd, text='Ok', command=self._on_ok)
            bt_ok.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
            bt_cancel = tk.Button(pn_cmd, text='Annulla', command=self._on_cancel)
            bt_cancel.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
            pn_cmd.grid_columnconfigure(0, weight=1, uniform='bt')
            pn_cmd.grid_columnconfigure(1, weight=1, uniform='bt')
            
    
        def _on_ok(self):
            sel = self.lst.curselection()
            if not sel: return
            idx = sel0
            value = self.lst.get(idx)
            if value:
                self.model = value
                self.destroy()
    
        def _on_cancel(self):
            self.destroy()
    
        def _load_models(self):
            contents = os.listdir(self.cache)
            models = [x.split('.')0 for x in contents if x.endswith('.json')]
            for m in models:
                self.lst.insert(tk.END, m)
    
    def select_model(app, cache):
        dialog = ModelSelector(app, cache)
        return dialog.model
        
    
    class MainWin(tk.Tk):
        freqs = ['1','2','3','4','5']
        mixer = ['1','2','3','4','5']
        shape = ['1','2','3','4','5']
        def __init__(self):
            super().__init__()
            self._cache = ''
            self._model = ''
            self._set_environment()
            self._make_menus()
            self.populate()
    
        def _set_environment(self):
            ''' Stabilisce la posizione di storage dei modelli di combinazioni. '''
            # stabilisce la locazione per la cache in una sub-directory
            # della cartella contenente lo script denominata "Modelli"
            app_dir = os.path.abspath(os.path.dirname(sys.argv0))
            self._cache = os.path.join(app_dir, 'Modelli')
            # se la sub-directory non esiste la crea
            if not os.path.exists(self._cache) and not os.path.isdir(self._cache):
                os.mkdir(self._cache)
            
        def _make_menus(self):
            ''' Costruisce un sistema di menu per la finestra. '''        
            menubar = tk.Menu(self, bg='black', fg='white',
                              activebackground='blue', activeforeground='white')
            filemenu = tk.Menu(menubar, bg='black', fg='white',
                              activebackground='blue', activeforeground='white')
            filemenu.add_command(label="New", command=self._on_initialize)
            filemenu.add_separator()
            filemenu.add_command(label="Open", command=self._on_open)
            filemenu.add_separator()
            filemenu.add_command(label="Save", command=self._on_save)
            filemenu.add_command(label="Save As ...",  command=self._on_save_as)
            filemenu.add_separator()
            filemenu.add_command(label="Close", command=self.destroy)
            menubar.add_cascade(label="File", menu=filemenu)
            self.config(menu=menubar)
            
        def populate(self):
            self.title(' SINTHETIZER')
            self.configure(bg='black')
            self._scales = {'freqs': [],
                            'mixer': [], 
                            'shape': []}
            st_pnl = tk.LabelFrame(self, text='', fg='white', background='black')
            st_pnl.pack(padx=5, pady=5)
            st_pnl.grid(row=0, column=0, sticky='nsew')
            self.v_scales = []
            self.h_scales = []
            #for i in range(len(self.shape)):
             #   lbl = tk.Label(st_pnl, text=self.adsrv, background='black', fg='white', pady=10, padx=10, font=10)
              #  lbl.grid(row=0, column=i, padx=12, pady=50, sticky='ne')
               # sc = tk.Scale(st_pnl, from_=25, to=1, showvalue=True,  length=200, tickinterval=1, bg='black', fg='white', orient=tk.VERTICAL)
                #sc.set(0)
                #sc.bind("<ButtonRelease>", self.aggiorna_adsrv)       #binding  adsrv
                #sc.grid(row=2, column=i, padx=10, pady=10, sticky='ne')
                #st_pnl.grid_columnconfigure(i, weight=1)
                #self._scales['adsrv'].append(sc)
            st_pnl.grid_rowconfigure(1, weight=1)
            fr_pnl = tk.LabelFrame(self, text=' Frequency (Hz)', fg="white", background="black")
            fr_pnl.grid(row=0, column=1, sticky='nsew')
            for i in range(len(self.freqs)):
                #lbl = tk.Label(fr_pnl, text=self.freqs, fg='white', background="black")
                #lbl.grid(row=0, column=i, padx=5, pady=50, sticky='ne')
                sc = tk.Scale(fr_pnl, from_=1500, to=0, showvalue=True, length=200, tickinterval=1, bg='black', fg='white', orient=tk.VERTICAL)
                sc.set(0)
                sc.bind("<ButtonRelease>", self.aggiorna_freq)       #binding  freq
                sc.grid(row=2, column=i, padx=10, pady=10, sticky='se')
                self._scales['freqs'].append(sc)
                fr_pnl.grid_columnconfigure(i, weight=1, uniform='fsc')
            fr_pnl.grid_rowconfigure(1, weight=1)
            #fr = tk.LabelFrame(self, text='LFO1 for FM (Hz)', fg="white", background="black")
            #fr.grid(row=1, column=0, sticky='se')
            #for i in range(len(self.lfo1)):
             #   sc= tk.Scale(fr, from_=50, to=0, showvalue=True, length=200, tickinterval=1, bg='black', fg='white', orient=tk.VERTICAL)
              #  sc.set(0)
               # sc.bind("<ButtonRelease>", self.aggiorna_lfo1)       #binding lfo1
                #sc.grid(row=0, column=0, padx=10, pady=10, sticky='se')
                #self._scales['lfo1'].append(sc)
            fr_pnl = tk.LabelFrame(self, text=' Mixer (ohms)', fg="white", background="black")
            fr_pnl.grid(row=1, column=1, sticky='ew')
            for i in range(len(self.mixer)):
                lbl = tk.Label(fr_pnl, text=self.mixer, fg="white", background="black")
                lbl.grid(row=1, column=i, padx=10, pady=10, sticky='se')
                sc = tk.Scale(fr_pnl, from_=100000, to=0, showvalue=True, length=200, tickinterval=1,background='black', fg='white', orient=tk.VERTICAL)
                sc.set(0)
                sc.bind("<ButtonRelease>", self.aggiorna_mixer)       #binding mixer
                sc.grid(row=1, column=i, padx=10, pady=10, sticky='se')
                self._scales['mixer'].append(sc)   
    
            self.grid_columnconfigure(0, weight=1)
    
        def _on_initialize(self):
            ''' Imposta lo stato iniziale per un nuovo modello di frequenze. '''
            self._model = ''
            for s in self._scales['freqs']:
                s.set(0)
            for s in self._scales['mixer']:
                s.set(0)
    
        def _on_save(self):
            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
            values = {}
            for k in self._scales.keys():
                sets = []
                for i in range(len(self._scalesk)):
                    sets.append(self._scalesk.get())
                valuesk = sets
            try:
                with open(self._model, 'w') as f:
                    json.dump(values, f)
            except OSError as e:
                msg = 'Errore salvataggio dati mixer:\n\n' + repr(e)
                messagebox.showerror('Errore I/O', msg, parent=self)
                return
    
        def _on_save_as(self):
            if not self._model:
                msg = 'Questo modello non ha nome, utilizzare il comando "save"'
                messagebox.showinfo('Comando improprio', msg, parent=self)
                return
            name = simpledialog.askstring('Nome modello', 'inserire il nome da assegnare', parent=self)
            if not name:
                return
            name = os.path.join(self._cache, name + '.json')
            if os.path.exists(name):
                msg = 'Nome modello già in uso'
                messagebox.showerror('Duplicazione', msg, parent=self)
                return
            self._model = name
            values = {}
            for k in self._scales.keys():
                sets = []
                for i in range(len(self._scalesk)):
                    sets.append(self._scalesk.get())
                valuesk = sets
            try:
                with open(self._model, 'w') as f:
                    json.dump(values, f)
            except OSError as e:
                msg = 'Errore salvataggio dati mixer:\n\n' + repr(e)
                messagebox.showerror('Errore I/O', msg, parent=self)
                return        
    
        def _on_open(self):
            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:
                    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():
                data = valuesk   #data è il dizionario degli slader
                print(valuesk)
                for i in range(len(self._scalesk)):
                    self._scalesk.set(data)
                    
        
        def aggiorna_freq(self, evt):
            w = evt.widget
            try:
                index= self._scales['freqs'].index(w)
                valuesindex = w.get()
                for index in range(0,5):
                    print(index, '=>', valuesindex)
            except ValueError as e:
                return                        
    
        def aggiorna_mixer(self, evt):
            w = evt.widget
            try:
                index = self._scales['mixer'].index(w)
                values[index + 5] = w.get()
                for index in range(5,10):
                    print(index, '=>', valuesindex)
            except ValueError as e:
                return           
    
    if __name__ == '__main__':
        #crea finestra
        app = MainWin()
        app.configure(background='black')
        app.geometry("1000x1000+0+0")
        app.resizable(False,False)
        app.configure(background="black")
        app.mainloop()
    
    
       
    
        
    
    


    Nessuno mi può aiutare?






  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    Ho inserito la riga da te menzionata e messa dentro il ciclo for() di adsrv, poi ho messo un print, ma non funziona.

    Ecco il codice così come l'ho modificato.
    Che ne pensi?








    --- Ultima modifica di fabio75 in data 2024-06-23 20:38:40 ---
  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    In che punto del codice devo mettere la riga sotto? Ho fatto delle prove ma ad ogni modifica della posizione dello slader la chiave non cambia, perchè?

    self._scales['adsrv']1.get()
    
    


    --- Ultima modifica di fabio75 in data 2024-06-23 18:19:39 ---
  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    Ho un problema: non riesco a capire qual'è il nome del dizionario per cui ad ogni modifica dello specifico slader mi permette di avere l'aggiornamento della specifica posizione.
  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    Grazie funziona!!

    Mi sei stato di grande aiuto, ora basta importare tastiera.py.

    tastiera.py serve ad inviare gli array degli slader lungo la USB specifica


    collegata all' ARDUINO UNO in questione.

    Grazie mille. :ok:

  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    Allora il mio scopo è per il momento salvare in una variabile per ciascun slader (meglio un array per gruppo di slader) la rispettiva posizione.

    Tali variabili saranno dichiarate in un secondo file .py chiamato tastiera.py.

    Detto file sarà incluso con import da SINTHETIZER.py.

    Lo scopo di tastira.py è calcolare le frequenze delle armoniche partendo dal valore dei rispettivi slader e il tasto premuto della rispettiva nota in una tastiera PC.

    Tastiera.py sarà fatto da una classe e due oggetti istanziati chiamati scheda1 e scheda2 (rispettivamente la parte sx e quella dx della scheda del mio progetto).

    In un secondo momento salverò le combinazioni degli slader per comodità in alcuni file che riproducono con tali combinazioni i vari timbri armonici.


    Tali file verranno aperti per comodità per impostare gli slader.



    1 - No non devono averne.





    2 - No sono etichette con valori fissi e tali devono rimanere.




    3 - Nei file aperti da SINTETHIZER.py e tasiera.py devo caricare le variabili degli inviluppi e combinazione di armoniche per ottenere un determinato strumento.




    4 - SINTHETIZER.py è l'interfaccia grafica come vedi, mentre tastiera.py calcola il valore delle frequenze delle armoniche a partire dai valori dei rispettivi slader e del tasto PC premuto, ottenendo una nota specifica.








    --- Ultima modifica di fabio75 in data 2024-06-10 18:21:52 ---

    --- Ultima modifica di fabio75 in data 2024-06-10 18:23:56 ---
  • Re: Problema a estrapolare posizione slader in una variabile in tkinter
    Forum >> Programmazione Python >> GUI
    Scusami ma ho avuto altro da fare in questi due anni oltre a studiare il linguaggio, abbi pazienza, ma non faccio ste cose per lavoro.

    Chiedo solo un aiuto.