Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi56
Firma forum
Fatti non foste a viver come bruti...
  • Re: Python comunica con il Db PostgreSQL
    Forum >> Programmazione Python >> Database
    ... il codice che mi ha fornito @nuzzopippo mi è stato di grande aiuto per schiarirmi le idee ma se in alcuni punti io non so cosa indica quel codice non posso farci niente sicuramente io provo a vedere a cosa è collegato cosa richiama ecc ma non ne ho la certezza per questo ho fatto quella proposta, però se essa va contro i principi del forum allora mi scuso ma ripeto il mio obbiettivo non è quello di copiare ma capire...
    Non si tratta di principi del Forum e, sopra tutto, non è niente di personale, tienilo ben presente

    ... "capire" : è il punto essenziale da raggiungere per poter cominciare a programmare e l'aspirante programmatore ha due potenti strumenti a disposizione per poterlo fare; il suo primo strumento è, naturalmente, la documentazione, cui ricorre frequentemente, il secondo è il ragionamento unito ad un approfondito esame del problema




    prendiamo il caso del "pnl" da Te prima indicato, esaminando l'istruzione

    pnl = tk.Frame(window)
    Ti viene rivelato che pnl è un widget di tkinter collegato ad un elemento "window" e chiamato Frame, la cui documentazione rivela che è un contenitore per altri widget

    o, se prendiamo i vari cmd, considerando il "cmd" e basta possiamo vedere dall'istruzione


    cmd = []
    che è una normalissima variabile, di tipo lista, e per di più una lista vuota cui vengono caricati, con l'istruzione

    cmd += [cmd_new, cmd_undo, cmd_save, cmd_pre, cmd_next, cmd_close]
    i vari pulsanti di comando (ossia oggetti tkinter di classe "Button") definiti come ricadenti in "pnl", loro master o parent che dir si voglia, che li include e ne controlla certi aspetti (documentazione docet), pulsanti che hanno assegnate, nella loro definizione

    cmd_next = tk.Button(pnl, text='>', command=on_next, state='normal')
    al parametro "command", delle funzioni (definite convenzionalmente di "callback") che "fanno qualcosa", nello specifico in esempio la funzione "on_next" non fa altro che richiamare la funzione 2on_index" passandole "1" quale parametro "value" ed on_index provvede a valutare il parametro passato, adeguare la variabile globale "index" e quindi invocare la funzione preposta alla visualizzazione del dato di "index" corrente.




    ... ora, questo lavoro di comprensione di ciò che si ha di fronte è ciò che porta ad imparare ed è anche l'argomento delle precedenti critiche mie e di @Palmux, è il lavoro su cui Ti dovresti impegnare e che Ti viene indicato, solo dopo averlo fatto e circa argomenti su cui veramente non sei riuscito a quadrare e/o non hai trovato documentazione, si potrebbero porre domande

    ... e sei Tu che lo devi fare il lavoro su, non è che si possa stare più di tanto a dar spiegazioni su script banali come quello in questione e poi, come ben dice @Palmux, Ti serve proprio per imparare.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Python comunica con il Db PostgreSQL
    Forum >> Programmazione Python >> Database
    Daniele aka Palmux said @ 2022-11-17 10:35:24:
    ...Vedi questa è esattamente la mia paura di cui scrivevo sopra. Quando si "regala" codice si tende poi a riceverlo senza fare troppa fatica per imparare. Resto contrario a fornire questo tipo di aiuto, perché ...
    In effetti non mi aspettavo una richiesta come quella ricevuta dallo OP, domande a livello così basso da far pensare sconosciuti i concetti di definizione di funzione o nomi di variabili (i cmd_etc) scambiati per chissà che ...

    Come hai ben detto, @Palmux, il mio voleva essere solo uno spunto per mostrare una semplice possibile logica di approccio per la evidente carenza operativa che credo di rilevare nel suo primo post ... di per se non sono molto contrario a fornire esempi di codice, spesso io stesso ho i concetti necessari ma non vedo bene come applicarli; ho imparato molto da codice altrui.




    @Nino48, mi spiace davvero doverTi dire di no ma per spiegarTi dettagliatamente quel codice dovrei scrivere un mezzo libro in commenti ed avevo detto già prima di postarlo che è troppo lungo.

    Debbo, inoltre, dire che sono un po' preoccupato riguardo le scadenze del Tuo stage, se davvero hai problemi sul "def" (che è il punto di inizio della definizione di una funzione o di un metodo) e confondi nomi di variabili quali "cmd" (usato per una lista e per i nomi dei bottoni) con chissà che, significa che hai bisogno di almeno qualche mese di studio prima di poter affrontare argomenti quali le interfacce grafiche (che che se ne pensi la loro implementazione "seria" è MOLTO complessa) e database

    ... se sei in tale condizione e davvero Ti interessa imparare a programmare in python Ti suggerirei di inzziare con il tutorial e qualche libro elementare (ne trovi i link nella sezione "documentazione" della pagina principale) e solo dopo aver acquisito la bare ri-affrontare l'argomento.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Python comunica con il Db PostgreSQL
    Forum >> Programmazione Python >> Database
    Si vorrei vederlo grazie mille
    Mi scuso se incollo qui il codice pur essendo lungo, non conosco pastebin, mi sembra voglia il login.

    Il codice che segue e di tipo "funzionale" (le mie considerazioni sul pattern le ho già espresse) ed opera con sqlite3, provvedendo a creare una tavola come indicato nel 1° post di @nino48 e crea una finestra con tre entry per l'inserimento dei dati (il widget tk.Text è eccessivo per lo sscopo), verifica che i dati siano completi e permette di inserirli e sfogliarli ma non di modificarli o cancellarli.

    Ho staccato la logica di callback dalla logica di manipolazione dati, i callback sono effettuati da specifiche funzioni (on_new, on_undo, on_save, on_previous, on_next ed on_close) valorizzando il parametro "command" dei pulsanti di controllo.

    Le funzioni di manipolazione e ricerca dati (connect, make_table e get_data) e per la visualizzazione (on_index e show_data) fanno riferimento a variabili globali, in particolare la connessione al database si effettua una sola volta ed riutilizzata per tutta la durata applicativa, i cursori vengono, invece, definiti alla bisogna all'interno delle funzioni di gestione.
    Il database (tab1.db) viene posizionato nella directory dello script, si faccia molta attenzione all'ordine di definizione delle variabili ed implementazione delle funzioni, una funzione NON vede le variabili globali definite dopo di essa.
    Si faccia attenzione che a volte l'editor modifica il codice (non so come manipolarlo per correggere)
    import os
    import sys
    import sqlite3
    
    import tkinter as tk
    from tkinter import messagebox
    
    def make_table(conn):
        query =  'CREATE TABLE two (name TEXT, age INTEGER, height REAL)'
        curr = conn.cursor()
        curr.execute(query)
    
    def get_data(conn):
        query = 'SELECT * FROM two'
        try:
            curr = conn.cursor()
            result = curr.execute(query).fetchall()
        except:
            return None
        return result
        
    def store_new(conn, new_data):
        query = 'INSERT INTO two VALUES(?, ?, ?)'
        try:
            cur = conn.cursor()
            cur.execute(query, new_data)
            conn.commit()
        except Exception as e:
            conn.rollback()
            raise Exception(e)
    
    def connect():
        app_dir = os.path.abspath(os.path.dirname(sys.argv[0]))
        dbname = os.path.join(app_dir, 'Tab1.db')
        nodb = False
        if not os.path.exists(dbname) or not os.path.isfile(dbname):
            nodb = True
        try:
            conn = sqlite3.connect(dbname)
            if nodb: make_table(conn)
        except:
            return None
        return conn
    
    conn = connect()
    data = None
    index = 0
    
    window = tk.Tk()
    window.title('server')
    window.resizable(True, False)
    dida =  tk.Label(window, text='')
    dida.grid(row=0, column=0, columnspan=2, padx=5, pady=5, sticky='w')
    lbl = tk.Label(window, text='Nome :')
    lbl.grid(row=1, column=0, padx=5, pady=5, sticky='w')
    text_box_1 = tk.Entry(window)
    text_box_1.grid(row=1, column=1, padx=5, pady=5, sticky='ew')
    lbl = tk.Label(window, text='Età :')
    lbl.grid(row=2, column=0, padx=5, pady=5, sticky='w')
    text_box_2 = tk.Entry(window, width=5)
    text_box_2.grid(row=2, column=1, padx=5, pady=5, sticky='w')
    lbl = tk.Label(window, text='Altezza :')
    lbl.grid(row=3, column=0, padx=5, pady=5, sticky='w')
    text_box_3 = tk.Entry(window, width=7)
    text_box_3.grid(row=3, column=1, padx=5, pady=5, sticky='w')
    
    cmd = []
    
    def show_data():
        if not data:
            dida.configure(text='Nessun dato esistente')
            messagebox.showinfo('Informazione', 'Nessun dato disponibile')
            return
        dida.configure(text='Record %d di %d' % (index+1, len(data)))
        dida.update()
        row = data[index]
        text_box_1.delete(0, 'end')
        text_box_2.delete(0, 'end')
        text_box_3.delete(0, 'end')
        text_box_1.insert('end', row[0])
        text_box_2.insert('end', str(row[1]))
        text_box_3.insert('end', str(row[2]))
        window.update()
    
    def on_index(value):
        global index
        if not data: return
        index += value
        if index < 0:
            index = len(data) - 1
        elif index >= len(data):
            index = 0
        show_data()
    
    def on_save():
        global data
        name = text_box_1.get()
        age = text_box_2.get()
        height = text_box_3.get()
        if not name or not age or not height:
            msg = 'Completare i dati da inserire'
            messagebox.showwarning('Dati insufficienti', msg)
            return
        try:
            new_data = (name, int(age), float(height))
        except ValueError:
            msg = 'Inserire stringa per il nome, intero per età e float per altezza'
            messagebox.showerror('Dati non validi', msg)
        try:
            store_new(conn, new_data)
        except Exception as e:
            msg = 'Avvenuto errore :\n' + repr(e)
            messagebox.showerror('Errore dati', msg)
            return
        data = get_data(conn)
        cmd[0].configure(state='normal')
        cmd[1].configure(state='disabled')
        cmd[2].configure(state='disabled')
        cmd[3].configure(state='normal')
        cmd[4].configure(state='normal')
        cmd[5].configure(state='normal')
        data = get_data(conn)
        on_index(0)
    
    def on_new():
        text_box_1.delete(0, 'end')
        text_box_2.delete(0, 'end')
        text_box_3.delete(0, 'end')
        cmd[0].configure(state='disabled')
        cmd[1].configure(state='normal')
        cmd[2].configure(state='normal')
        cmd[3].configure(state='disabled')
        cmd[4].configure(state='disabled')
        cmd[5].configure(state='disabled')
    
    def on_previous():
        on_index(-1)
    
    def on_next():
        on_index(1)
    
    def on_undo():
        cmd[0].configure(state='normal')
        cmd[1].configure(state='disabled')
        cmd[2].configure(state='disabled')
        cmd[3].configure(state='normal')
        cmd[4].configure(state='normal')
        cmd[5].configure(state='normal')
        show_data()
    
    def on_close():
        conn.close()
        window.destroy()
    
    pnl = tk.Frame(window)
    pnl.grid(row=4, column=0, columnspan=2, sticky='ew')
    cmd_new = tk.Button(pnl, text='Nuovo', state='normal', command=on_new)
    cmd_new.grid(row=0, column=0, padx=5, pady=5, sticky='ew')
    cmd_undo = tk.Button(pnl, text='Annulla', command=on_undo, state='disabled')
    cmd_undo.grid(row=0, column=1, padx=5, pady=5, sticky='ew')
    cmd_save = tk.Button(pnl, text='Salva', command=on_save, state='disabled')
    cmd_save.grid(row=0, column=2, padx=5, pady=5, sticky='ew')
    cmd_pre = tk.Button(pnl, text='<', command=on_previous, state='normal')
    cmd_pre.grid(row=0, column=3, padx=5, pady=5, sticky='ew')
    cmd_next = tk.Button(pnl, text='>', command=on_next, state='normal')
    cmd_next.grid(row=0, column=4, padx=5, pady=5, sticky='ew')
    cmd_close = tk.Button(pnl, text='Esci', command=on_close, state='normal')
    cmd_close.grid(row=0, column=5, padx=5, pady=5, sticky='ew')
    cmd += [cmd_new, cmd_undo, cmd_save, cmd_pre, cmd_next, cmd_close]
    for i in range(6):
        pnl.grid_columnconfigure(i, weight=1, uniform='a')
    window.grid_columnconfigure(1, weight=1)
    
    data = get_data(conn)
    show_data()
    
    window.mainloop()
    
    Spero che l'esempio aiuti @nino48, ovviamente come linea logica, fai sapere e per chiarimenti si è qua
    EDIT : come temevo, non vengono visualizzate le parntesi quadre alla variabile cmd ed altro, @nino48, tieni presente che cmd è una lista contenente i pulsanti di comendo.


    RI-EDIT : inseriti i backslash (ci ho dovuto lavorare un po'), giacché c'ero ho rimediato ad una improprietà formale commessa lasciando l'inserimento dei nuovi dati nel callback, ora è la funzione "store_new(conn, new_data)" quella che effettua l'effettivo inserimento mentre il callback si limita a preparare i dati ed invocarla ... giusto per una più giusta rappresentazione del "model"



    --- Ultima modifica di nuzzopippo in data 2022-11-16 11:18:22 ---

    --- Ultima modifica di nuzzopippo in data 2022-11-16 14:55:46 ---

    --- Ultima modifica di nuzzopippo in data 2022-11-16 14:58:28 ---

    --- Ultima modifica di nuzzopippo in data 2022-11-16 15:01:02 ---
    Fatti non foste a viver come bruti...
  • Re: Python comunica con il Db PostgreSQL
    Forum >> Programmazione Python >> Database
    Grazie @Palmux





    @Nino48

    Magari la visualizzazione del mio codice risulterà dolorosa ma ho appena iniziato ad approcciarmi al mondo di python ...

    In merito al "dolore", non riferivo alla mancata indentazione ma proprio alla metodologia di programmazione (funzionale) implicita nel codice proposto, le interfacce grafiche (chiamiamole GUI per prevità), a mio parere (che confesso molto condizionato dal java) i "dolori" li proverai cercando di programmare GUI tramite funzioni, sono convinto che, indipendentemente dal linguaggio, è opportuno utilizzare la programmazione ad oggetti (le classi di python) per affrontare tale aspetto.




    Non voglio minimamente scoraggiare ma avevo visto già (dal codice) che si è nella fase iniziale di apprendimento, interfacce grafiche e database sono, purtroppo, già argomenti piuttosto avanzati, se non hai già una discreta base python rischi di confonderti e girare a vuoto, perdendo tempo.




    Ti ho preparato un esempio minimale, con approccio funzionale e non ad oggetti che solitamente uso per la materia, sulla falsa-riga del tuo codice ma ccon utilizzo di sqlite3, se ritieni di volerlo vedere Te lo posto.




    @Palmux, una domanda a proposito del codice, l'esempio è di 172 righe, veramente minimale per una GUI ma comunque un bel po' da esporre in un post.

    In altro occasioni ho allegato files di codice ma un po' di tempo fa ho letto degli interventi da cui mi sembra di arguire che non sia una metodologia molto gradita, quale è la politica del forum?

    Nel caso bisogni appoggiarsi a siti "esterni" ve ne è qualcuno utile cui non bisogni iscriversi ed eseguire login (ne ho già troppi di accounts)



    --- Ultima modifica di nuzzopippo in data 2022-11-15 20:49:49 ---
    Fatti non foste a viver come bruti...
  • Re: Python comunica con il Db PostgreSQL
    Forum >> Programmazione Python >> Database
    A Livello di codice nessun problema e funziona il programma senza errori....
    Scusate la mia "irruzione" nel post




    Suppongo che il "funziona il programma" indicato da @Nino48 riferisca alle istruzioni di creazione tavola ed inserimento/estrazione dati, essendo il blocco di codice carente del mainloop() di tkinter e di funzioni di callback.

    Per altro, la strutturazione del codice è dolorosamente "scomoda" per una gestione ad interfaxxia grafica, un approccio "funzionale" potrebbe anche essere utilizzato, malgrado il thread bloccante di tkinter, ma ...




    @Nino48, hai concetti di OOP?




    Io un po' me la cavo con tkinter, al momento non ho disponibile un server PostgreSQL ma, se ti andasse si potrebbe implementare un esempio minimale con Sqlite (senza utilizzo di sqlalchemy), giusto per indicazione di massima.

    Nel caso Tu lo ritenga utile indica una struttura di tabella (semplice) con tre-quattro righe di dati di partenza e tre-quattro righe di dati da inserirsi che provo a svilupparTi un piccolo esempio.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Risultato eicerca nella tabella
    Forum >> Programmazione Python >> Database
    Se io faccio una SELECT su una tabelle e in questa tabella il parametro ricercato non c'è , Sqlite3 mi restituisce "none".
    Come faccio ad intercettare questo "none" per fargli eseguire una certa cosa quando nella tabella non trova nulla ??

    Naturalmente devi testarla, "None" ha un valore booleano "False" e, per altro, può essere più specificatamente visto con l'operatore 'is' (guarda la voce "identity" nella mappa), sotto degli sbrigativi esempi di controllo

    Python 3.10.6 (main, Nov  2 2022, 18:53:38) [GCC 11.3.0] on linux
    Type "help", "copyright", "credits" or "license()" for more information.
    def torna_parametro(param=None):
        return param
    
    result = torna_parametro('trescon')
    if result:
        print('restituito', result)
    else:
        print('Non è stato restituito niente')
    
        
    restituito trescon
    result = torna_parametro()
    if result:
        print('restituito', result)
    else:
        print('Non è stato restituito niente')
    
        
    Non è stato restituito niente
    if result is None:
        print('result non è niente')
    else:
        print('result è qualcosa')
    
        
    result non è niente
    
    


    Fatti non foste a viver come bruti...
  • Re: Classi e Tkinter
    Forum >> Principianti
    ... se modifico il codice con le classi ricevo un errore di "NameError: name 'ROOT' is not defined".
    Dipende dalla struttura del Tuo programma e dal name-space tanto del modulo quanto del resto del codice interessato.

    Se rot fa parte del namespace globale del modulo ed è definito prima dell'instanziamento della classe, allora, l'oggetto istanziato potrà vedere rot, altrimenti no, se per caso rot è definito all'interno di una funzione non potrà mai essere visto all'esterno di essa.




    Detto questo, guarda che in linea di principio un oggetto (inteso come istanza di una classe) dovrebbe essere "autosufficiente" per il suo compito, cioè conoscere tutto ciò che gli serve per eseguire la sua funzione o come variabile di istanza o come variabile di classe, e non dipendere da altri fattori esterni.




    Nel caso in specie (Tk() di tkinter) probabilmente l'oggetto rot dovrebbe essere passato come parametro e memorizzato quale variabile di istanza ma non può dirsi niente di certo non conoscendo il codice.

    Se ritieni, simula in un breve esempio la situazione che Ti da errore che vediamo un po'.

    Ciao

    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...