[Python] Fwd: pynput: help request.

Gabriele Battaglia iz4apu a libero.it
Mer 25 Lug 2018 10:38:13 CEST


Reply to the Manlio Perillo's message, wrote on 24/07/2018 at 22:47:
> On Tue, Jul 24, 2018 at 12:03 PM Gabriele Battaglia <iz4apu a libero.it> wrote:
>>
>> Ciao.
>> Avevo chiesto, ad una comunità online di Python, un aiuto per capirci
>> qualcosa di questa libreria, avrei voluto vedere un esempio di
>> funzionamento.
>> Posto qui il mio messaggio originale, se qualcuno ha uno script
>> funzionante che la include, potrebbe inviarmelo, per favore?
>>
> 
> pynput ha delle limitazioni abbastanza severe:
> https://pynput.readthedocs.io/en/latest/limitations.html
> 
> Sono accettabili per te?

Onestamente, Manlio, non so risponderti: ho letto la pagina linkata qui 
sopra ma non posseggo le competenze sufficienti per comprendere a fondo 
ciò che riporta. Azzarderei un "Non mi sembra che siano limitazioni 
importanti per me", ma chiaramente non ne sono affatto certo. Tuttavia, 
potrebbe essere un problema secondario. Potrei provare ad usare la 
libreria quando e se riuscirò a capire come diavolo funziona, e poi 
vediamo l'eventuale perchè non funziona.

[...]

> Se il tuo script gira su terminale, esiste un implementazione senza
> queste limitazioni.
Che significa? Un'implementazione di che, di Pynput stessa o del 
terminale? Sì, per problemi di accessibilità ed anche per mia personale 
incompetenza, tutti gli strumenti che realizzo in Python, girano sulla 
console di Windows e sul Terminale di MacOS. Niente grafica perciò, 
niente GUI di nessun tipo, soltanto scritte su terminale.

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

> 
> Da quello che leggo in
> https://github.com/python/cpython/blob/master/Lib/getpass.py#L97,
> getwch(e) ha il problema che non processa l'input e quindi devi
> gestire il KeyboardInterrupt da te.  Ma usando SetConsoleMode
> (https://docs.microsoft.com/en-us/windows/console/setconsolemode)
> dovrebbe essere possibile implementare la lettura da console secondo
> le tue necessità semplicemente resettando *solo* il flag
> ENABLE_LINE_INPUT.
Devo chiedere venia ancora una volta, mostrando tutta la mia ignoranza: 
sono ad un livello più niubbo di quanto credi. Non mi pare d'aver mai 
giocato con i flags del prompt di DOS, ne con quelli del terminale su 
MacOS: ho sempre lasciato tutto di default direi e lo script che mi va 
perfettamente sotto Python2 e che ho chiamato key.py, per l'appunto, 
va... Senza che ci sia stata necessità di modificare flags.

[...]

> 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; questo sarebbe proprio fiko per i miei scopi, ma il modulo 
pygame non posso usarlo perchè, per funzionare, richiede una modalità 
grafica attiva, che inibisce il modo console, quindi niente più print() 
sulla console.
A me comunque, basterebbe una funzione che mi ritorni il codice ASCII 
del carattere quando viene premuto e null quando non è premuto niente. 
Io la interrogherei ogni tot millisecondi e nel frattempo il mio 
programma si farebbe i fatti propri, senza interrompersi come con input()

Tutto qui. Grazie infinite per il tuo interesse, per le ricerche che hai 
fatto, per il tuo tempo e la tua gentilezza.

GabryB.


Maggiori informazioni sulla lista Python