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

Gabriele Battaglia iz4apu a libero.it
Mer 25 Lug 2018 13:58:15 CEST


Reply to the Manlio Perillo's message, wrote on 25/07/2018 at 13:13:
> On Wed, Jul 25, 2018 at 10:39 AM Gabriele Battaglia <iz4apu a libero.it> wrote:
>>
>> Reply to the Manlio Perillo's message, wrote on 24/07/2018 at 22:47:
>> [...]
>>> Comunque se sei su Windows puoi usare pyunput o msvcrt.getwche per
>>> implementare una bozza, e da questa chiedere consigli più dettagliati.
>> Ce l'ho già. Mi ero scritto un programma che funziona perfettamente e fa
>> ciò che voglio. Funziona stupendamente sia sotto Win che sotto MacOS
>> però... funziona solo per Python2 e, per un motivo che non sono in grado
>> di capire, non riesco ASSOLUTAMENTE a migrarlo sul 3. Correggo il codice
>> a livello formale, ma qualcosa smette di funzionare e non trovo una
>> soluzione.
>> Se vuoi/volete... lo posto qui in lista nel caso qualcuno avesse voglia
>> di buttarci un occhio... Non è lungo e il codice non è complesso.
>>
> 
> 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.

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

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

Gabriele.


Maggiori informazioni sulla lista Python