[Python] Non-Blocking input multiplatform. Era: Re: Fwd: pynput: help request.

Manlio Perillo manlio.perillo a gmail.com
Mer 25 Lug 2018 14:53:16 CEST


On Wed, Jul 25, 2018 at 1:59 PM Gabriele Battaglia <iz4apu a libero.it> wrote:
>
> Reply to the Manlio Perillo's message, wrote on 25/07/2018 at 13:13:
> [...]
> > Ottimo.
> > Allora dimentica tutto il resto che ho scritto e posta il codice su un
> > pastebin o su gist se hai un account github.
> > Cerca di eliminare tutte le parti che non sono necessarie.
> Ciao Manlio.
> Siccome sono pigro, io provo così, se poi, per qualche ragione tecnica
> non andasse bene, mi faccio l'account su github e te lo riposto là,
> fammi sapere se così va bene.
>
> Premessa: il modulo key.py che scarichi contiene 2 funzioni, guarda solo
> la key() e non la dgt(), di cui, eventualmente, mi occuperò in seguito.
>
> https://www.dropbox.com/s/195yfm2dpx407s2/key.py?dl=0
>
> Per migrarla su Python3, l'avevo corretta così:
>
> https://www.dropbox.com/s/mvcrhyglml2tg1d/key3.py?dl=0
>
> Ma senza successo.
>

Perchè setti stdin in modalità non blocking?
Se elimini quel codice, il programma funziona, sia key.py che key3.py

> >
> >> [...]
> >>
> >>> Che cosa vuoi fare? Intercettare la pressione dei tasti da tastiera a
> >>> basso livello, o semplicemente leggere un carattere alla volta dalla
> >>> tastiera senza che l'utente premi INVIO?
> >> Principalmente la seconda che dici. In pratica mi serve che determinate
> >> azioni partano quando io premo dei tasti, senza aspettare l'invio, che
> >> toglie immediatezza alla cosa. Questo è importante quando scrivo dei
> >> piccoli giochi, o quando la pressione dei tasti serve a compiere azioni
> >> che si ripetono spesso.
> >> Sarebbe bello poter fare quello che permette il modulo keyboard di
> >> pygame che provvede un array nel quale, per ogni tasto, ritorna un flag
> >> booleano quando il tasto viene premuto ed un altro quando viene
> >> rilasciato;
> >
> > Come controlli questo array mentre "fai qualcos'altro"?
> >
> Semplice: il corpo principale del programma è compreso in un ciclo
> while: ad ogni ciclo, una serie di if ed elif controllano se un certo
> tasto è premuto e se sì, chiamo una subroutine che lavora e poi riporta
> a false il flag del tasto premuto e ritorna al ciclo principale.
> Gli eventi da tastiera in questo modo vengono verificati all'inverso,
> cioè non è l'evento che scatena l'azione ma è il programma main che
> direttamente controlla se si è verificato un evento. So che non è
> elegante dal punto di vista del bravo coder, ma non ho trovato altre
> soluzioni.
>

Non sono sicuro di capire, ma se quello che vuoi fare è la funzione
dgt, allora secondo me ti stai complicando la vita.
Innanzitutto il programma fa una sola cosa alla volta: o legge un
carattere da tastiera o processa il carattere.

Il secondo problema è che dgt è inutilmente complicata.
Implementa 3 funzioni separate: parse_string, parse_int e parse_float,
ed in ciascuna funzione in un ciclo while chiama la funzione key.


> > Comunque non dovrebbe essere difficile emulare questa API, usando pyunput.
> > Se vedi https://pythonhosted.org/pynput/keyboard.html#monitoring-the-keyboard,
> > ti basta che nelle callback on_press ed on_release setti i flag
> > appropriati.
> > Ciascuna callback ha come parametro il codice del tasto premuto.
> >
> Ok Manlio, provo a fare qualche test.
>

No, lascia perdere.
Se devi fare il parsing, l'API attuale è la più semplice.
Con le callback è un bagno di sangue.


Ciao
Manlio


Maggiori informazioni sulla lista Python