Profilo di Claudio_F

Nome Claudio_F
Indirizzo email clau.fin@tin.it
AvatarAvatar utenti
Messaggi118
Firma forum
*** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Prendere il controllo da fuori interfaccia Tkainter
    Forum >> Programmazione Python >> GUI
    In base a dove è il carrello , il fine corsa mi abilita/disabilita dei button e delle label informative.
    Ecco il perché devo riuscire a “togliere il controllo” da Tkinter, altrimenti non mi permette di controllare l’evolversi delle operazioni.
    Direi che è il contrario, sei tu a tenere bloccato Tkinter monopolizzando il tempo, e quindi congelando la GUI.

    Come detto nell'altro thread con il metodo 'configure' dei widget cambi le proprietà, ma poi bisogna anche permettere a Tkinter di aggiornare la grafica, e i modi sono due, o si chiama il metodo 'update' del singolo widget, o si chiama il metodo 'update_idletasks' della root, che permette la gestione degli eventi accumulati in coda.

    Altrimenti bisogna riscrivere la propria logica in modo non bloccante.
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Prendere il controllo da fuori interfaccia Tkainter
    Forum >> Programmazione Python >> GUI
    La cosa è ancora piu' problematica se la richiesta di aggiornamento arriva da una periferica che "dovrebbe" riusciere a interrompere momentaneamente il MONOPOLIO dell'interfaccia grafica
    C'è qualcosa che non quadra.

    O il programma è strutturato tramite due o più thread/processi indipendenti, e allora può esserci qualcuno che vuole qualcosa dall'altro in modo asincrono... oppure l'unico processo in corso è il mainloop della GUI, e in tal caso è la GUI che deve controllare periodicamente la periferica e agire di conseguenza. Per i compiti periodici si può usare il metodo after:
    try:
        import Tkinter as tk
    except:
        import tkinter as tk
    
    #-------------------------------------------------------------
    def recall(msg):
        msg = msg[1:] + msg[:1]
        lab.configure(text=msg[:16])
        root.after(100, recall, msg)
    
    #-------------------------------------------------------------
    root = tk.Tk()
    root.resizable(False, False)
    
    frame = tk.Frame(root, relief=tk.RAISED, border=1, bg='black')
    frame.pack(padx=16, pady=16)
    
    lab = tk.Label(
        frame, relief=tk.SUNKEN, border=1,
        bg='#0D7FFF', fg='white', width=18, height=1,
        font=('monospace', 14, 'normal')
        )
    lab.pack(pady=8, padx=8, ipady=4)
    
    recall('               '
           'THE  QUICK  BROWN  FOX  JUMPS  OVER  THE  LAZY  DOG')
    
    root.mainloop()
    
    Naturalmente tutte le altre funzioni/metodi non devono bloccare il mainloop congelando la GUI, altrimenti anche 'recall' non viene chiamata.

    In un programma con GUI il mainloop comanda sempre, tutte le altre funzioni devono solo gestire nel più breve tempo possibile gli eventi che la GUI ha rilevato.

    Se ci sono attività cicliche che richiedono molto tempo, la loro esecuzione va scomposta in molti passaggi veloci chiamati dal mainloop.


    --- Ultima modifica di Claudio_F in data 2017-11-26 10:14:14 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Visualizzare un risultato di un ciclo in una label
    Forum >> Programmazione Python >> GUI
    Vuol dire che l5 identifica un oggetto None (che non ha il metodo configure) invece dell' oggetto Label che ti aspetteresti, quindi c'è un assegnamento errato a I5.


    --- Ultima modifica di Claudio_F in data 2017-11-04 23:45:35 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Visualizzare un risultato di un ciclo in una label
    Forum >> Programmazione Python >> GUI
    iltuowidget.configure(text='....')
    iltuowidget.update()
    --- Ultima modifica di Claudio_F in data 2017-11-04 17:25:07 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Visualizzare un risultato di un ciclo in una label
    Forum >> Programmazione Python >> GUI
    L'interfaccia normalmente si aggiorna quando è finita l'esecuzione di ogni funzione/metodo (e quindi quando il controllo torna al mainloop della GUI).

    Per forzare l'aggiornamento di un widget bisogna chiamarne il metodo update.
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Novizio con problema tkinter
    Forum >> Programmazione Python >> GUI
    Nel primo caso non funziona perché il parametro 'command' vuole il nome di una funzione da chiamare, non il risultato della chiamata di una funzione (a meno che il risultato sia a sua volta una funzione, ma non è questo il caso).

    Nel secondo caso funziona perché 'lambda' crea e restituisce una funzione (senza nome, ma che viene assegnata al parametro 'command'), che quando chiamata a sua volta chiama la funzione che hai specificato.

    L'uso delle funzioni come oggetti da passare/ritornare, e non solo come subroutine da chiamare, è comunque una caratteristica "avanzata", ma fa parte del modo estremamente generale di Python di trattare qualsiasi cosa come un generico oggetto (dai dati elementari ai moduli).


    --- Ultima modifica di Claudio_F in data 2017-10-30 20:50:52 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: la funzione round serve ad approssimare?
    Forum >> Principianti
    Ah, interessante. Mi accodo alla domanda.
    Questo scherzo lo fa solo con py3, mentre in py2 i risultati sono quelli che ci si aspetterebbe.

    >>> round(6.5)
    6
    >>> round(6.500000000000001)
    7
    


    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Ciao ragazzi, sono nuovo ho bisogno del vostro aiuto
    Forum >> Principianti
    Il codice normalmente si incolla come testo (usando l'apposito tag ).

    Comunque il None deriva da questo:
    >>> def f():
    ...     pass
    ... 
    >>> print f()
    None
    >>> 
    print f() stampa quanto viene restituito dalla funzione.

    In questo esempio la funzione 'f' non compie nessuna operazione e non restituisce al chiamante nessun "valore" esplicito, perciò per default restituisce None (dato o oggetto nullo) che viene stampato da print.


    --- Ultima modifica di Claudio_F in data 2017-09-27 11:47:16 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: Python e GUI
    Forum >> Principianti
    Studiare le classi serve per avere almeno la conoscenza sintattica per leggere gli esempi. Poi l'esperienza viene col tempo e la pratica. Più che altro intendevo anche il concetto che ogni cosa assegnata ad una variabile è un riferimento ad un certo oggetto, e che ogni tipo di espressione crea nuovi oggetti. Comandi come join, append ecc sono funzionalità di questi oggetti che operano sui dati in essi contenuti. Quando si chiama una classe (del modulo tkinter) viene creato un oggetto grafico il cui riferimento si salva in una variabile. Quando si vuole usare quell'oggetto si chiamano i suoi metodi (.configure, .set ecc).

    Un errore frequente e presente anche in qualche tutorial è scrivere una cosa del genere credendo di salvare nella variabile 'etic' il riferimento all'oggetto Label per poterla usare in un secondo momento ad esempio per modificarne il testo:
    etic = tkinter.Label(text="ciao").pack()
    ...mentre si salva solo l'oggetto finale prodotto dal metodo .pack che è l'oggetto nullo None, quindi si perde la possibilità di usare l'oggetto Label chiamandolo col nome 'etic'.

    Ecco è importante capire, leggendo un'espressione/istruzione da sinistra verso destra, con quale oggetto/dati si ha a che fare in ogni punto, perché queste sono tutte espressioni/istruzioni valide, ma ad 'etic' vengono assegnate cose completamente diverse:
    etic = tkinter
    etic = tkinter.Label
    etic = tkinter.Label(text="ciao")
    etic = tkinter.Label(text="ciao").pack
    etic = tkinter.Label(text="ciao").pack()



    --- Ultima modifica di Claudio_F in data 2017-08-29 20:37:35 ---
    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***
  • Re: inizializzazione classi
    Forum >> Principianti
    non pensavo ci fosse differza tra uno o due underscore


    Gli underscore sono caratteri validi per i nomi come gli altri:
    >>> _ = 1
    >>> __ = 3
    >>> print(_ + __)
    4
    

    La console interattiva può comportarsi in modo diverso anche con le righe vuote e segnalare dei syntax error che in realtà nel codice non ci sono.

    *** Il codice va evidenziato con il simbolo di fianco ai colori per non perdere l'indentazione ***