Profilo di nuzzopippo

Nome nuzzopippo
Indirizzo email nuzzopippo@gmail.com
AvatarAvatar utenti
Messaggi153
Firma forum
Fatti non foste a viver come bruti...
  • Re: sqlite3 in rete
    Forum >> Programmazione Python >> Database
    Ciao, il mio problema ora è di far convivere nello stesso script l'interfaccia tkinter (che so essere task monopolizzate) e la routine che devo eseguire ogni 30/60 secondi per vedere se ci sono messaggi nuovi.
    Come posso fare a far eseguire il task per la verifica finchè ho l'interfaccia tkinter in esecuzione ?
    I Miei saluti.




    Segnalo che venerdì scorso, ad un mio tentativo (piuttosto voluminoso) di rispondere al quesito soprastante, si è avuta una anomalia che ha creato un riferimento senza titolo ed a me intestato nella sezione "database", non accessibile e visibile alla pagina di riepilogo delle sezioni, questo perché possano, eventualmente, prendersi provvedimenti inerenti.




    Per il problema di @trescon, provo s rispondere ora in maniera succinta.

    Hai diverse metodologie a disposizione, la più "immediata" (e forse problematica) è di creare un metodo/funzione che richiami ricorsivamente se stessa ogni tot di tempo utilizzando il metodo "after" delle finestre tkinter.

    Personalmente evito di utilizzare la metodologia sopra, nel tempo ho preso l'abitudine, per situazioni non critiche, di utilizzare thread in parallelo, con un protocolli di comunicazione utilizzanti il pattern observer ed un intermediario di tipo singleton per lo smistamento delle comunicazioni, di norma senza l'uso di queue (dato che parlo di sistemi non critici) ... ho cercato di esemplificare in dettaglio ma sono intervenuti i problemi su detti.

    Se ritieni Ti bisogni un esempio di tal genere fai sapere che cercherò di implementare un esempio minimale a Tuo uso e vedrò di spiegarlo altrove e poi vedo di renderlo disponibile.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Installzione fpdf2
    Forum >> Programmazione Python >> GUI
    Allora.... io ho provato a eseguire il programmino dall'idle di python e da un altro programma (Geany) e funziona regolale......... la prova che non funzionava l'avevo fatta con Thonny.
    Allora, è certamente una questione di "ambiente" (venv, ovviamente) utilizzato, Thonny può essere configurato per utilizzare uno specifico interprete, tra quelli creati nel sistema, dando il comando "Strumenti => Opzioni" ed indicandone il path assoluto nella casella "Eseguibile Python" del tab "Interprete".




    Per altro, quando aggiorni il sistema, forse, le impostazioni correnti di Thonny potrebbero non venire aggiornate, potresti provare a controllare.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Installzione fpdf2
    Forum >> Programmazione Python >> GUI
    Ciao Nuzzopippo e grazie; io lo avevo immaginato perché cosi è riportato nelle documentazione ma perché io se in uno script importo la libreria fpdf ottengo l’errore che ho riportato ? Se io guardo i pacchetti installati vedo fpdp2 vers. 2.7.8. Installata …..allora perchè dell’errore ?

    Vuoi dire che nell'ambiente python con i pacchetti che hai indicato nel primo post l'errore lo ottieni quando esegui

    >>> from fpdf import FPDF
    
    
    ... se è così è molto strano, non dovrebbe succedere a meno che non sia stata in qualche modo corrotta l'installazione di fpdf2 o che Tu stia in un ambiente python diverso da quello che Ti da l'elenco di pacchetti esposto.

    Suggerirei di provare, nell'ambiente che Ti da quell'elenco di pacchetti di aprire una sessione python da terminale e provare a fare l'import manualmente dal prompt, se non Ti da errori, avrai l'indicazione che il problema sorge nel contesto di esecuzione (ambiente python diverso), se invece avrai errori copia l'intera sessione, compreso il traceback, e postala come codice, come ho fatto io, indicando il contesto con cui operi (s.o., eventuali IDE, altre notizie significative) perché si possa valutare

    ... certo, non è detto che noi si possa riprodurre il Tuo problema, ma almeno si potrà cercare di ragionarci su.




    Per altro, hai provato a crearti un venv "pulito", ad installarci li fpdf2 e provarne l'utilizzo in quel venv?




    Fai sapere, ciao

    Fatti non foste a viver come bruti...
  • Re: Installzione fpdf2
    Forum >> Programmazione Python >> GUI
    fpdf2 è un fork di fpdf, quando lo installi viene generato un modulo "fpdf" che è quello da importare per operare, considerando di installarlo in un virtusl rnvironment, nella cartella "xxx_venv/lib64/pythonx.xx/site-packages" verranno create DUE cartelle, una denominata "fpdf2-2.7.8.dist-info" che conterrà le informazioni generali sul pacchetto, l'altra denominata "fpdf" che conterrà i veri moduli da utilizzare.

    Pertanto, anche se in se il pacchetto è identificato quale "fpdf2" per utilizzare la libreria a livello operativo bisognerà utilizzare "fpdf" quale modulo, fpdf2 NON lo è ... tale import è indicato chiaramente nel tutorial e negli esempi.
    Un esempio di sessione in un mio venv che forse chiarirà meglio :
    NzP:~$ source firme_v/bin/activate
    (firme_v) NzP:~$ python -m pip list
    Package                 Version
    ----------------------- -------
    defusedxml              0.7.1
    FindSystemFontsFilename 0.2.0
    fontmeta                1.6.1
    fonttools               4.47.2
    fpdf2                   2.7.8
    freetype-py             2.4.0
    pillow                  10.2.0
    pip                     22.0.2
    setuptools              59.6.0
    uharfbuzz               0.39.0
    (firme_v) NzP:~$ python
    Python 3.10.12 (main, Nov 20 2023, 15:14:05) [GCC 11.4.0] on linux
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import fpdf2
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    ModuleNotFoundError: No module named 'fpdf2'
    >>> import fpdf
    >>> fpdf.__version__
    '2.7.8'
    >>> from fpdf import FPDF
    >>> quit()
    (firme_v) NzP:~$
    come puoi vedere, pur essendo il "package" identificato quale fpdf2 esso non è un modulo, il modulo è "fpdf" ed ha la stessa versione ("2.7.8") del package.

    Ciao :)



    --- Ultima modifica di nuzzopippo in data 2024-04-05 07:23:38 ---
    Fatti non foste a viver come bruti...
  • Re: Django
    Forum >> Programmazione Python >> GUI
    Un saluto a tutti, sto realizzando una web app con Django. E mi serve un aiuto con una ricerca in js richiamata da una view. Non ho trovato una sezione django e non so dove postarla
    Mi dite dove ?

    Essendo Django un framework per servizi di rete penso che "Web e Reti" sia la sezione più opportuna.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: ValueError: cannot set WRITEABLE flag to True of this array
    Forum >> Programmazione Python >> Calcolo scientifico
    non riesco a risolvere

    Oh ... beh, anche la mia sfera di cristallo rimane muta, tra tante ignote possibilità :) ... scherzi a parte, dare un po' di contesto forse sarebbe utile (cosa utilizzi ed in quali versioni, cosa hai fatto, codice interessato, etc.)




    Comunque, guarda un po' qui vedi se ti trovi in una condizione similare ed eventualmente prova i suggerimenti li presenti.




    Ciao

    Fatti non foste a viver come bruti...
  • Re: Costruttore per sottoclasse con super().
    Forum >> Principianti
    Ciao, non sono una cima ma mi hai incuriosito, il Tutorial che stai seguendo è questo qua? Ed il codice "che leggi" è forse questo?

    Se si, stai affrontando una bella bestia di argomento, molto complesso che, se ho capito bene quel poco visto è basata su pattern "Publisher/subscriber", queue, etc ... roba tutt'altro che immediata

    Per quello che ne so la stringa """MoveGroupPythonIntefaceTutorial""" è una doc-string praticamente inutile e la modalità di stesura del codice è un po' prolissa, forse ereditata da passate versioni di python, prolissa dicevo e, da quel che ho capito, non dovrebbe fare niente di diverso che se fosse scritta così:class MoveGroupPythonIntefaceTutorial():
      def __init__(self):
        ... resto del codice attivo senza "super"
    
    Magari mi sbaglio, in tal caso invoco i più esperti di me che intervengano.

    Ciao ed auguri per il Tuo apprendimento :)

    EDIT: corretti alcuni artefatti dell'editor





    --- Ultima modifica di nuzzopippo in data 2024-03-06 18:36:08 ---
    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-03-04 16:26:19:
    Veniamo ora ai punti di cui Ti volevo avvertire :

    1 - in utility.Delivery vi sono diverse istruzioni "raise RuntimeError ...." esse stanno li perché dovrebbero essere intercettate e gestite, altrimenti emetteranno un traceback in una eventuale shell di avvio, ovviamente quando lo ho manipolato non ho "gonfiato" il codice con la gestione degli errori, pensaci ... al minimo trasforma i "raise" in "return"
    ...
    In primis ho cercato una traduzione del vocabolo; trovato una mezza enciclopedia sui suoi possibili significati in lingua italiana. :)
    Le istruzioni

    raise RuntimeError('Gruppo %s non registrato' % group)
    della classe utility.Delivery scatenano un errore di run-time, tale errore "dovrebbe" essere intercetato e gestito (ovviamente nella GUI) ma la faccenda richiederebbe tutta una serie di accorgimenti, comunque Ti suggerirei la lettura del capitolo 8 del tutorial, è un capitolo molto importante e significativo e "racconta" ciò che volevo indicare.

    Comunque, Ti suggerivo di sostituire tae genere di istruzione con un semplice "return" ... praticamente di non far nulla per quelle condizioni di errore.





    Riguardo al punto 2, per caso hai implementato "anche" quel "self.sok.settimeout(0.1)" che ho indicato come "soluzione di emergenza" per il daemon che rimarrebbe appeso?

    Nel caso Tu lo abbia fatto, testa bene il punto, può comportare perdita di dati, un decimo di secondo è decisamente ingeneroso, utilizzato per test, una soluzione coerente sarebbe mooolto più laboriosa. Ho sollevato l'argomento principalmente per indicarTi che c'erano altre problematiche da vedere, circa i socket, che non è agevole trattare in un post.



    Pietro Bruno Lancerotto said @ 2024-03-04 16:26:19:
    Il sistema funziona; abbiamo provato per un paio d'ore in condizioni reali e la "banda bassotti" si è dichiarata più che contenta ed invia i ringraziamenti per il fondamentale aiuto

    Se mi è riuscito di essere utile ne sono contento ... comunque, testatelo bene il Vostro terminale.

    Ciao :)


    Fatti non foste a viver come bruti...
  • Re: sqlite3 in rete
    Forum >> Programmazione Python >> Database
    ...
    In pratica i farei un db principale e poi farei tanti db quanti sono gli utenti; vorrei fare in modo che gli utenti quando leggono il db leggano il principale mentre quando scrivono il db scrivino su quello personale; pensavo poi di fare una procedura sul server che con scadenza di 20/30 secondi controlli se nei vari db locali ci sai quancosa di nuovo e... se si lo copia nel db principale "leggibile da tutti".
    ...
    Scusa la domanda, in genere utilizzo altri db per certe cose, ma c'è un qualche motivo che rende difficile l'utilizzo di un singolo database con accesso concorrente?

    Tutto sommato i tempi di scrittura non dovrebbero essere eccessivi, la concorrenza minima con 5-6 utenti e racchiudendo l'operazione di scrittura in blocchi "begin concurrent -> commit" l'interferenza dovrebbe essere minima.

    Fatti non foste a viver come bruti...
  • Re: Utilizzo Socket
    Forum >> Principianti
    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Ho fatto qualche adattamento ...
    In effetti e quello che si deve fare : capire le indicazioni, approfondire ed adattare il tutto ai propri scopi.
    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Poi, cosa che non c'entra nulla con Python, ho eliminato molti più caratteri
    L'intestazione con il FROM TO LEN a livello pratico delle nostre necessità non riveste alcuna importanza

    Si, ho provato le nuove impostazioni con il server che ho mandato ptima ... naturalmente, funzionano male con esso dato che trattano un protocollo di comunicazione che non vi è contemplato.

    ... C'è quel "nostre" che mi preoccupa un po' ... hai presente, vero, che quelle che Ti do solo solo indicazioni e che dovresti approfondire le tematiche rivenienti?

    Vi sono problematiche che temo potresti non aver presenti, che non danno molto fastidio a Te che codifichi ma se passi il Tuo lavoro ad altri è bene non ci siano ... Te ne indicherò un paio in seguito

    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    ...
    E' possibile che quella finestra Rispetti i ritorni a capo ??

    La finestra rispetterà i ritorni a capo solo (e soltanto) se riceverà una stringa codificata quale utf-8, i singoli caratteri"\" e "n", passati come tali non verranno interpretati come new-line ... in pratica, dovresti decodificare l'insieme di bytes da passare alla finestra come 'utf-8'

    Pietro Bruno Lancerotto said @ 2024-02-27 18:24:51:
    Mi defisci collega, troppo onore. Mi reputo uno smanettone ignorante.

    Non credere io sia un "sapiente" sono a mia volta un (vecchio) smanettone ignorante che cerca di imparare qualcosa, magari su python ho avuto più tempo di Te ma rimani un collega :)




    Veniamo ora ai punti di cui Ti volevo avvertire :

    1 - in utility.Delivery vi sono diverse istruzioni "raise RuntimeError ...." esse stanno li perché dovrebbero essere intercettate e gestite, altrimenti emetteranno un traceback in una eventuale shell di avvio, ovviamente quando lo ho manipolato non ho "gonfiato" il codice con la gestione degli errori, pensaci ... al minimo trasforma i "raise" in "return"




    2 - più "pesante", il recv dei socket è bloccante, come è impostato al momento Chatterbox alla chiusura della applicazione rimane appeso un thread in attesa di comunicazione (è un daemon) ... non se ne accorge nessuno ma non è una bella cosa ... e qui si incappa in complessità da far piangere (socket + thread + strutturazione codice) ... soluzione di "emergenza" :

    A - in Chatterbox :

    - funzione "connect" definire un timeout per il socket immediatamente dopo la connessione, così:

                self.sok.connect((self.svr, self.port))
                self.sok.settimeout(0.1)
    
    
    la "temporizzazione" è di un decimo di secondo

    - gestire l'errore di timeout nel target del thread, modificando il metodo "listen" come segue:

        def listen(self) -> None:
            while self.still:
                try:
                    data = self.sok.recv(2048)
                    if data:
                        # qui andrebbe una queue per collezionare i dati giunti
                        # ma complicherebbe le cose, mi limito a comunicare
                        msg = ['RECEIVED', data[86:-3].decode(encoding="UTF-8", errors="ignore")]
                        #print(msg)
                        self.pub.send_message('LISTENERS', msg)
                except socket.timeout:
                    continue
            self.sok.close()
            msg = ['OUTCOME', f'Connessione con {self.svr} chiusa']
            self.pub.send_message('OBSERVER', msg)
            self.pub.unsubscribe('WORKER', self.obs)
    
    
    B - modificare PAGINA in modo che dia tempo alle operazioni del socket, ritengo sia bene spezzettare "_on_close" in modo da avere più "ordine" nella eliminazione delle registrazione e tempo, in questo modo:

        def _on_close(self) -> None:
            msg = ['CLOSING', 'CLOSING']
            self.pub.send_message('WORKER', msg)
            self.top.after(500, self.__close)
    
        def __close(self) -> None:
            self.pub.unsubscribe('OBSERVER', self.obs)
            self.pub.unsubscribe('LISTENERS', self.obs)
            self.top.destroy()
    
    
    credo debba essere sufficiente.




    Comunque, thread e socket sono bestioline complicate ed approfondite, così come la strutturazione del codice ... hai ricevuto la mia email di risposta? Se ritieni posso inviarti una maccheronica traduzione (fatta da me e non pubblicabile) di un tutorial sui thread che ho trovato "buono" come spunto per approfondire l'argomento.




    Ciao

    Fatti non foste a viver come bruti...