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 <iz4...@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.
_______________________________________________
Python mailing list
Python@lists.python.it
https://lists.python.it/mailman/listinfo/python

Rispondere a