Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi49
Firma forum
Fatti non foste a viver come bruti...
  • Re: Farsi restituire un testo in una variabile usando tkinter
    Forum >> Principianti
    Un'ultima cosa se volessi che dopo aver cliccato il pulsante "read" si chiudesse la finestra , ovviamente lasciando memorizzata la variabile in text_var che altra istruzione dovrei aggiungere.
    Scrivere qualcosa del genere, dici?import tkinter as tk
    from tkinter import messagebox as msg
    
    root = tk.Tk()
    root.geometry("400x240")
    
    def get_text_input():
        global text_var
        text_var = textExample.get("1.0","end")
        root.destroy()
    
    def show_text_var():
        msg.showinfo('Valore Variabile', text_var)
        
    
    textExample=tk.Text(root, height=10)
    textExample.pack()
    btnRead=tk.Button(root, height=1, width=10, text="Read", command=get_text_input)
    btnRead.pack()
    btn_show_var = tk.Button(root, text="Mostra text_var", command=show_text_var)
    btn_show_var.pack()
    
    text_var = ''
    
    root.mainloop() 
    
    print('text_var ora è %s' % text_var)
    Si, funzionerebbe ma valgono le considerazioni dette prima, inoltre potresti utilizzare la variabile solo dopo la chiusura del mainloop di tkinter, che è un thread bloccante.
    Caricarsi un framework grafico per un semplice input è come usare una bomba atomica per una zanzara, una semplice chiamata alla funzione bult-in "input()" sarebbe molto più pratica.

    Altro discorso se la Tua intenzione fosse l'utilizzo di dati definiti in una gui tkinter in un contesto "estraneo" (inteso come esterno) al mainloop che, come detto, è bloccante ... si "potrebbe" fare, per gioco l'ho fatto utilizzando thread ed oggetti singleton implementanti i pattern Publisher/Subscriber, non è una passeggiata però e, comunque, a parte la prova "per gioco" non ho mai trovato un motivo valido per usare realmente tali metodi in qualcosa che faccio.

    Pensa bene a ciò che Ti occorre.




    Edit : Giusto per darTi una vaga idea di ciò cui andresti incontro, in questo appunto, per mero esercizio, utilizzo il pattern Publisher/subsriber per far comunicare una gui con un gestore dati, da tale base può, con alcuni accorgimenti far comunicare thread separati (di cui uno sia tkinter) ma con diversi ordini di complicazione in più.




    Ciao



    --- Ultima modifica di nuzzopippo in data 2022-07-21 08:26:13 ---

    --- Ultima modifica di nuzzopippo in data 2022-07-21 08:28:31 ---
    Fatti non foste a viver come bruti...
  • Re: problema a posizionare un controllo slider
    Forum >> Programmazione Python >> GUI
    Ho una mezza idea di presentare il progetto completo (parti elettroniche e software) come cosa open-source, che ne dici?


    Non so però se sarà una cosa degna sul piano delle conoscenze tecniche, da poter essere pubblicata come progetto open e farlo evolvere dai vari nerd della rete.
    Riguardo lo open-source, beh, di tendenza sono quel che si dice "un linuxaro", sono visceralmente favorevole alla condivisione di conoscenze e tecniche escogitate.

    Riguardo alla "dignità" di ciò che puoi produrre ... discorso complicato, certo che devi approfondire e limare un po' ciò che realizzi, farlo per lo meno "benino", chi guarda "qualcosa" di norma lo abbandona se vede evidenti strafalcioni, non avere fretta e fai le cose "per bene".




    Riguardo, poi, i "nerd" non contarci molto, la maggior parte delle proposte nasce e muore con il suo autore, temo che ben poco trova collaborazioni esterne, anche se sono buone idee ... certo che qualcosa di ben fatto e ragionevolmente interessante può trovare un certo seguito ma è un evento piuttosto raro e, spesso, non per demerito delle proposte ma solo perché non capita il "tipo giusto" che in quel momento si interessi allo specifico argomento ... i nerd hanno loro finalità da perseguire, di solito.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Array multidimensione e liste
    Forum >> Principianti
    Devo riuscire a comprendere meglio le liste multidimensionali.

    Python è potentissimo e permette con un unico comando di agire su un'intera lista, ma la sua sintassi ancora mi sfugge, soprattutto per quanto riguarda le liste a due dimensioni.

    Lavorando sul tuo esempio, spero di capirle meglio... perché sembra siano potenti e comode.
    Si, python è potente ma quello che Ti ho proposto è solo linguaggio base, una volta che avrai assimilato la base (leggi il tutorial e cerca di padroneggiare i concetti trovati) dai una guardata alla libreria numpy, gli array in particolare Ti forniranno strumenti molto più potenti ancora.
    Fatti non foste a viver come bruti...
  • Re: problema a posizionare un controllo slider
    Forum >> Programmazione Python >> GUI
    Grazie mille per il codice: vedo che sei molto competente con gli oggetti.
    La mia idea è quella di realizzare un synthetizer anni 70 stile Minimoog,
    ...
    P.S: Posso eventualmente chiederti consigli in privato su come progettare tali classi nel caso mi piantassi? Te ne sarei grato.
    Ti assicuro che ho ancora moltissimo da imparare, ho solo avuto la fortuna di interagire con utenti molto esperti che mi hanno dato indicazioni utili e un retroterra java in merito alle classi.

    Ma bada bene, la OOP va bene in certi contesti (tipo le GUI), meno bene in altri, Python permette varie modalità di approccio e spesso la programmazione funzionale è utile, approfondisci il linguaggio per imparare a discernere l'approccio utile per i vari contesti da affrontare.




    Visto il Tuo mixer.py, hai manipolato l'aspetto grafico, abbi cura di implementare opportune variabili di istanza con cui affrontare gli eventi dei vari gruppi di slider nei relativi binding, così com'è il codice da errori, dato che i binding originali riferiscono ad una variabile che hai eliminato (esegui il codice da terminale per vederli)

    Per altro, vedendo immmagini del Minimog-D vedo che i controlli sono pulsanti rotondi, possono anche essere realizzati in tkinter (vedi i Canvas e gli eventi del mouse (key-press, key-release e rilevamento delle coordinate), tieni inoltre presente che altri framework grafici hanno disponibili controlli "rotondi" di tal genere, per vederne meglio tale possibilità, guarda le rappresentazioni di QDial in fondo a questa pagina, le QT non le conosco ma sento che vanno per la maggiore al momento (ovviamente, da non mischiare con tkinter, sono un framework diverso).




    Per quanto riguarda i consigli "in privato" : NON voglio fare un rimprovero ma si scrive nei forum per condividere la conoscenza e crescere tutti assieme, almeno, questo è lo spirito con cui sono nati, anche se molti utenti sembrano ignorarlo.

    Se scrivo qui è perché cerco di ricambiare con quel poco che so l'enorme aiuto che è stato dato a me, Ti inviterei, pertanto, ad esporre nel Forum i Tuoi problemi in modo che eventuali soluzioni siano disponibili a tutti, per altro potrebbero anche intervenire altri utenti con conoscenze maggiori sulle problematiche poste e, magari, se argomento interessante, persino qualche utente esperto.

    Con ciò non voglio negarTi un aiuto se proprio Ti sia necessario ma tieni presente che sono poco in giro, ho miei impegni che assorbono moltissimo tempo e non necessariamente sarei in condizione di impegnarmi su argomenti che esulano dalle mie conoscenze, per altro non perderei certo tempo per faccende che potresti trovare nella docs o con qualche ricerca in rete.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: problema a posizionare un controllo slider
    Forum >> Programmazione Python >> GUI
    Vorrei però iniziare a posizionare il primo in verticale in posizione 10,10 pixel e poi il secondo in posizione 20,10 etc con gli altri magari utilizzando un ciclo for per automatizzare la cosa dato che sono molti sti controlli slider che voglio mettere.
    ...

    P.S.: Che vantaggi ci sono ad usare pesantemente le classi in una applicazione?
    Per la seconda domanda, è un po' complicato rispondere, la programmazione "Object Oriented" (OOP per gli amici) è un paradigma (piuttosto complesso) che permette di costruire degli "oggetti" utilizzando altri oggetti come se fossero mattoncini (diciamo così) ereditando proprietà e metodi degli oggetti utilizzati (ereditarietà) magari trasformandoli a secondo come servano (polimorfismo) od anche inserendovi nuove proprietà e metodi.

    Dal punto di vista "pratico" garantisce un maggior controllo (a prezzo di una maggiore complessità) sul proprio codice ... e, purtroppo, sono uno dei pochi modi per affrontare efficacemente la programmazione di interfacce grafiche, procedendo nel Tuo apprendimento Ti accorgerai che è molto più difficoltose (se non impossibile) utilizzare la programmazione procedurale o funzionale con le interfacce grafiche.




    Venendo al Tuo problema, NON puoi stabilire la posizione di una serie di controlli senza tener conto che i controlli stessi hanno delle loro proprietà, tra cui le dimensioni, che variano da sistema a sistema secondo le impostazioni generali dello stesso (gestore grafico del s.o., fonts, etc.), ragionare su dimensioni "fisse" (gestore grafico place) ti porta notevoli complessità di gestione, compreso il ricalcolo manuale dell'intera finestra ad ogni minimo ridimensionamento.

    Ritengo più opportuno sfruttare le proprietà "elastiche" dei gestori di geometria "grid" o "pack" nel definire la propria finestra, Ti suggerirei di studiare e comprendere tali gestori (oltre alle classi) procedendo a piccoli passi, è fondamentale "capire" cosa si può fare.

    Se ho compreso bene la problematica, devi crearTi una specie di mixer, giusto?

    Ho buttato giù un semplice esempio (con le classi, proceduralmente sarebbe un incubo) ove effettuo il sub-classamento dell'oggetto Tk di tkinter, gli creo tre pannelli popolandoli con dei cicli for basati su due insiemi di variabili indicanti dei set di strumenti e frequenze, per poi definire degli scale che aggiornano delle Labels (sempre definite in cicli for) con i valori selezionati ... per i 10 pixel, li ho utilizzati per la "separazione" tra i widget (proprietà padx e pady nelle istruzioni grid), spero possa esserTi utile, provalo e cerca di comprendere la logica, ho cercato di essere semplice ma il codice è un bel po', quindi non ho inserito commenti, la docs di tkinter ti potrà aiutare

    Il codice:

    import tkinter as tk
    
    class MainWin(tk.Tk):
        struments = ['basso', 'chitarra', 'piano', 'sax']
        freqs = ['bassi', 'medio bassi', 'medi', 'medi superiori', 'alti']
        def __init__(self):
            super().__init__()
            self.index = 0
            self.populate()
    
        def populate(self):
            self.title('Esempio per Fabio75')
            st_pnl = tk.LabelFrame(self, text=' Strumenti ')
            st_pnl.grid(row=0, column=0, sticky='ns')
            self.v_scales = []
            self.h_scales = []
            for i in range(len(self.struments)):
                cnv = tk.Canvas(st_pnl, width=12, height=50)
                cnv.grid(row=0, column=i, padx=10, pady=10)
                cnv.create_text(6, 25, text=self.struments, angle=90, anchor='center')
                #sc = tk.Scale(st_pnl, from_=0, to=100, showvalue=False, orient=tk.VERTICAL, command=self.on_struments)
                sc = tk.Scale(st_pnl, from_=0, to=100, showvalue=False, orient=tk.VERTICAL)
                sc.bind("<ButtonRelease>", self.on_struments)
                sc.grid(row=1, column=i, padx=10, pady=10, sticky='nsew')
                st_pnl.grid_columnconfigure(i, weight=1)
                self.v_scales.append(sc)
            st_pnl.grid_rowconfigure(1, weight=1)
            fr_pnl = tk.LabelFrame(self, text=' Frequenze')
            fr_pnl.grid(row=0, column=1, sticky='ew')
            for i in range(len(self.freqs)):
                lbl = tk.Label(fr_pnl, text=self.freqs)
                lbl.grid(row=i, column=0, padx=10, pady=10)
                sc = tk.Scale(fr_pnl, from_=0, to=100, showvalue=False, orient=tk.HORIZONTAL)
                sc.bind("<ButtonRelease>", self.on_frequences)
                sc.grid(row=i, column=1, padx=10, pady=10, sticky='nsew')
                self.h_scales.append(sc)
            fr_pnl.grid_columnconfigure(1, weight=1)
            val_pnl = tk.LabelFrame(self, text=' Valori selezionati ')
            val_pnl.grid(row=2, column=0, columnspan=2, sticky='ew')
            lbl = tk.Label(val_pnl, text='Strumento', font='bold')
            lbl.grid(row=0, padx=10, pady=10, column=0)
            lbl = tk.Label(val_pnl, text='Volume', font='bold')
            lbl.grid(row=0, padx=10, pady=10, column=1)
            for i in range(len(self.freqs)):
                lbl = tk.Label(val_pnl, text=self.freqs, font='bold')
                lbl.grid(row=0, column=i+2, padx=10, pady=10)
            self.lst_val = []
            row = 1
            for s in self.struments:
                lbl = tk.Label(val_pnl, text=s)
                lbl.grid(row=row, column=0, padx=10, pady=10)
                l_row = []
                lbl = tk.Label(val_pnl, text='', width=4, relief='sunken')
                lbl.grid(row=row, column=1, padx=10, pady=10)
                l_row.append(lbl)
                for i in range(len(self.freqs)):
                    lbl = tk.Label(val_pnl, text='', width=4, relief='sunken')
                    lbl.grid(row=row, column=i+2, padx=10, pady=10)
                    l_row.append(lbl)
                self.lst_val.append(l_row)
                row += 1
            for i in range(len(self.freqs)+2):
                val_pnl.grid_columnconfigure(i, weight=1, uniform='a')
    
            self.grid_columnconfigure(1, weight=1)
    
        def on_struments(self, evt):
            w = evt.widget
            try:
                index = self.v_scales.index(w)
                value = w.get()
            except ValueError:
                return
            self.index = index
            self.lst_val[self.index]0.configure(text=value)
            
            
        def on_frequences(self, evt):
            w = evt.widget
            try:
                index = self.h_scales.index(w)
                value = w.get()
            except ValueError:
                return
            self.lst_val[self.index][index+1].configure(text=value)
    
    
    if __name__ == '__main__':
        app = MainWin()
        app.mainloop()


    Azz. vedo che l'editor interferisce con il codice, allego il file, fai sapere se Ti è sufficiente.

    Non inserisco link a miei esempi, sono molto più complessi di quanto sopra, comunque, se ritieni di voler dare una guardata fai sapere.



    --- Ultima modifica di nuzzopippo in data 2022-07-16 12:25:30 ---
    Fatti non foste a viver come bruti...
  • Re: problema a posizionare un controllo slider
    Forum >> Programmazione Python >> GUI
    Salve ho scritto il seguente codice python:..
    e mi succede che col metodo w.grid() nn riesco a posizionare lo slider nella row 100 e column 10, perchè?
    Non è che si capisca bene cosa Vorresti fare, tanto meno quale gestore di geometria Tu voglia utilizzare, al widget Scale assegni valori di griglia, quindi non usi "grid" ma il gestore "pack", quindi, il controllo ha posizione "Top-Center" nella finestra ... dovresti vederTi un po' come funzionano questi gestori.

    Per altro, quand'anche utilizzassi effettivamente il gestore grid se le 100 righe e 10 colonne precedenti sono vuote non hanno dimensione.




    Descrivi bene cosa vuoi fare, se mi trovo cercherò di aiutarti.




    Per altro, ogni tanto mi scrivo degli appunti su qualcosa, qualcuno riguarda anche tkinter (ove uso pesantemente le classi) e ti occorre qualche esempio (piuttosto complesso però, diverse centinaia di righe) potrei lincarTi un mio appunto in uso "anche" uno scale posizionato con grid (non lo metto se non richiesto per non fare spam)




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Farsi restituire un testo in una variabile usando tkinter
    Forum >> Principianti
    Di per se il discorso sarebbe semplice, dichiari una variabile e ci memorizzi il valore estratto dal widget, questa variante al Tuo codice

    import tkinter as tk
    from tkinter import messagebox as msg
    
    root = tk.Tk()
    root.geometry("400x240")
    
    def get_text_input():
        global text_var
        text_var = textExample.get("1.0","end")
    
    def show_text_var():
        msg.showinfo('Valore Variabile', text_var)
        
    
    textExample=tk.Text(root, height=10)
    textExample.pack()
    btnRead=tk.Button(root, height=1, width=10, text="Read", command=get_text_input)
    btnRead.pack()
    btn_show_var = tk.Button(root, text="Mostra text_var", command=show_text_var)
    btn_show_var.pack()
    
    
    text_var = ''
    
    root.mainloop()
    permette di leggere il valore del widget Text e di memorizzarlo nella variabile "text_var" con la pressione del pulsante "read", la pressione del tasto "Mostra text_var" ti esporrà il valore memorizzato in una dialog




    MA ... le cose non sono mica così semplici, noterai che text_var è utilizzata quale variabile globale (peccato mortale), i framework grafici si usano con paradigmi più articolati di questa esemplificazione, un loro utilizzo efficace richiede una buona conoscenza della base del linguaggio (con particolare approfondimento delle classi) ed una certa infarinatura di OOP e degli eventi che concorrono in una GUI




    Edit ho dovuto modificare il nome della Tua funzione perché l'editor di questo Forum dava problemi inserendolo con il nome da Te assegnato



    --- Ultima modifica di nuzzopippo in data 2022-07-16 08:30:47 ---

    --- Ultima modifica di nuzzopippo in data 2022-07-16 08:31:31 ---
    Fatti non foste a viver come bruti...
  • Re: Array multidimensione e liste
    Forum >> Principianti
    Si può accedere alle liste tramite indici, il Tuo problema è schematizzabile in una lista di liste e risolvibile a patto che i dati siano di tipo uniforme, preso il Tuo esempio e problematica basta estrarre gli elementi che hanno "Pilota" all'indice di posizione "1"

    Python 3.8.10 (default, Mar 15 2022, 12:22:0 8) 
    [GCC 9.4.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    >>> data = '''980782763 Pilota 17,54 4,9
    984006423 Pilota 19,95 4,9
    904924394 Pilota 16,06 4,9
    980782763 Auto 20,9 6,5
    984006423 Trattore 19,1 5,9
    904924394 Trattore 19,4 5,9'''
    >>> data_list = [x.split() for x in data.split('\n')]
    >>> for r in data_list:
    	print(r)
    
    	
    ['980782763', 'Pilota', '17,54', '4,9']
    ['984006423', 'Pilota', '19,95', '4,9']
    ['904924394', 'Pilota', '16,06', '4,9']
    ['980782763', 'Auto', '20,9', '6,5']
    ['984006423', 'Trattore', '19,1', '5,9']
    ['904924394', 'Trattore', '19,4', '5,9']
    >>> len([x for x in data_list if x1 == 'Pilota'])
    3
    >>> 
    La sintassi, forse, potrebbe darTi delle difficoltà, dato che ho sbrigativamente utilizzato le list-comprehensions che, comunque, fanno parte della base del linguaggio.

    Maggiori dettagli in merito li troverai nel tutorial che, certamente, Ti fornirà anche maggiori delucidazioni sull'uso degli elementi basilari del linguaggio, liste comprese ... è un documento che vale la pea leggere.





    Ciao




    EDIT: l'editor deforma il codice, lo "1" seguente lo "if x" dell'ultimo comando è tra parentesi quadre




    --- Ultima modifica di nuzzopippo in data 2022-07-14 08:27:21 ---
    Fatti non foste a viver come bruti...
  • Re: Problema con Tkinter()
    Forum >> Programmazione Python >> GUI
    Traceback (most recent call last):
    File "c:\Users\Nicola surface pro\Desktop\Paride_python\tkinter.py", line 1, in <module>
    import tkinter as tk
    File "c:\Users\Nicola surface pro\Desktop\Paride_python\tkinter.py", line 3, in <module>
    root = tk.Tk ()
    AttributeError: partially initialized module 'tkinter' has no attribute 'Tk' (most likely due to a circular import). Did you mean: 'tk'?
    In realtà, l'errore è dato dal fatto che hai denominato il Tuo script come "tkinter.py", coprendo, nello spazio dei nomi, il framework grafico, il Tuo modulo cerca di importare da se stesso Tk generando, quindi, un errore.




    Rinomina il Tuo modulo e lo scrip funzionerà (forse, non ho guardato il codice)


    Fatti non foste a viver come bruti...
  • Re: Messaggio di errore : sqlite3.OperationalError: near "INTEGER": syntax error
    Forum >> Programmazione Python >> Database
    Buonasera, cosa potrebbe essere sbagliato nella riga ...
    La riga stessa, temo, non è un costrutto SQL valido, tipicamente, una istruzione di inserimento nuovo record sarebbe qualcosa del genere:

    INSERT INTO nome_tabella [(nome_campo, nome_campo, ...)]
    VALUES (valore, valore, ...)
    

    il "nome_campo" tra parentesi quadre stanno ad indicare una certa opzionalità.

    Edit dimenticavo, la tipologia di dato è definita in fase di creazione della tavola, non va indicata nella query di inserimento, è il particolare che ti da errore, nel caso in specie.



    Il linguaggio di interrogazione dati SQL ha sintassi ben precise, purtroppo "personalizzato" in vari "dialetti". Tale sintassi è quasi comparabile a quella di un linguaggio di programmazione, se lo si vuole utilizzare bisogna conoscerlo.

    Per altro, la sintassi di Sqlite3 permette di utilizzare delle specie di "segnaposto" ("?" p.e.) che facilitano le operazioni sollevando dalla parte di sintassi relativa alla tipologie dei dati.

    In giro si trova parecchio in merito, comunque qui una spiegazione abbastanza chiara su "INSERT", anche se incompleta, pur se più ostica non trascurare la .documentazione ufficiale.

    Ciao



    --- Ultima modifica di nuzzopippo in data 2022-05-11 20:14:02 ---
    Fatti non foste a viver come bruti...