[Python] Non Blocking input crossPlatform: aiuto per codice.

Manlio Perillo manlio.perillo a gmail.com
Mer 27 Feb 2019 13:12:52 CET


On Wed, Feb 27, 2019 at 11:08 AM Gabriele Battaglia <iz4apu a libero.it> wrote:
>
> Gente, so che sono uno stress infinito con sta storia, me ne rendo conto
> e mi scuso.
> Le mie enormi lacune in programmazione unitamente alle mie esigenze
> particolari di utente disabile, mi rendono un po una spina nel fianco di
> questo gruppo: grazie per la vostra pazienza e per tutto il vostro aiuto
> e supporto. Per fortuna che il traffico qui non è tanto elevato.
>
> Ribadisco, ed è importante, che chiunque si deve sentire libero di
> rispondere solo quando e se ha tempo e voglia, non ho fretta alcuna.
>

Io trovo le tue domande interessanti, proprio perchè sei novizio e disabile.

> Riepilogando.
> Io scrivo piccoli programmini privi di GUI, utili principalmente a me
> che usano testo in out e tastiera in input. Ho bisogno di un modulo che
> possa importare in tutti i miei scripts che agevoli l'input da tastiera
> facendo sostanzialmente 2 cose:
> 1. che non blocchi tutto mentre l'utente scrive e, 2. che non debba
> attendere la pressione di invio.
> Tutto deve funzionare sotto Windows e sotto Unix BSD e tutto deve andare
> in modalità terminale, quindi niente grafica, niente pygame o altre
> librerie che cambiano la modalità di visualizzazione della console.
>
> La miglior approssimazione di ciò che mi serve è questa:
>
> https://www.dropbox.com/s/rzd3wwrsmyx587p/key14.py?dl=0
>

Non hai problemi con il software di assistenza quando imposti la
modalità non canonica su Unix?
Inoltre un consiglio: per entrare ed uscire dalla modalità non
canonica, usa un context:
https://docs.python.org/3/reference/datamodel.html#with-statement-context-managers

Ti basta definire il metodo __enter__ che semplicemente restituisce
self, ed il metodo exit che resetta il terminale.
In questo modo puoi fare:

with KBHit() as kb:
    ...

> Funziona bene sotto Unix, perciò guardate solo la parte che riguarda
> Windows che ha dei problemi:

Ironicamente, su Windows è molto più facile fare quello che vuoi,
perchè non ha i problemi che ci sono su Unix.
I terminali su Unix sono un incubo, per non parlare dei problemi sei
vuoi impostare la modalità non bloccante su un file:
https://cr.yp.to/unix/nonblock.html.

Per impostare la modalità non canonica:
https://docs.microsoft.com/en-us/windows/console/setconsolemode

Per vedere se c'è input disponibile (ma non credo ti serva):
https://docs.microsoft.com/en-us/windows/console/peekconsoleinput

Per leggere in Unicode:
https://docs.microsoft.com/en-us/windows/console/readconsole

Per attendere la pressione di un tasto, con timeout (simile a select):
https://docs.microsoft.com/en-us/windows/desktop/api/synchapi/nf-synchapi-waitforsingleobject

> innanzitutto va a capo ogni volta che
> stampa un carattere, se imposto end="" in print(), non stampa più nulla
> finchè non premo invio e da ultimo crasha quando premo un carattere non
> alfanumerico, magari questo si sistema facilmente, non ho approfondito.
>

Non sono sicuro di capire il primo problema.  Perchè devi premere
[INVIO] per forzare print a scrivere sul terminale?
Riguardo il crash (tecnicamente non è un trash, ma una eccezione non
gestita), dovresti allegare il traceback completo.

> [...]

Ciao
Manlio Perillo


Maggiori informazioni sulla lista Python