Forum >> Principianti >> rilevamento pressione tasto (magari il tasto ESC)

Pagina: 1 2 Avanti

Ciao , il mio quesito di oggi riguarda " l'aggancio " e gestione della pressione di un tasto all'interno di un ciclo while true.
Il tasto che "preferirei usare" è il tasto ESC.

Non so che comando/libreria usare che non sia BLOCCANTE del ciclo while.




Grazie




------
Alberto
Ciao @trescon




Dovresti precisare il contesto di esecuzione in cui vuoi intercettare la tastiera, cioè se lo devi intercettare da shell o da interfaccia grafica, le modalità sono molto diverse.




Se, come suppongo, lo devi intercettare da shell, le cose dipendono anche dal sistema operativo in uso, una breve ricerca mostra che esistono varie possibilità, p.e. keyboard od anche pynput, od altro ancora, in ogni caso, la gestione degli eventi di tastiera, in una shell testuale, è materia molto tosta, almeno per me, nella docs di pynput vi sono degli esempi interessanti utilizzanti i thread ... ma, magari, utenti più addentro sapranno dare indicazioni migliori.




Se, invece, l'intercettazione deve avvenire in un contesto gestito da un framwork grafico, p.e. tkinter, il discorso è notevolmente più facile, essendo i vari widget predisposti alla gestione degli eventi, nello specifico di tkinter dovresti decidere quale widget dovrebbe fare il binding, magari il frame della finestra, nel link vi è un esempio in tal senso proprio all'inizio.

Fatti non foste a viver come bruti...
Ciao @trescon




Dovresti precisare il contesto di esecuzione in cui vuoi intercettare la tastiera, cioè se lo devi intercettare da shell o da interfaccia grafica, le modalità sono molto diverse.




Se, come suppongo, lo devi intercettare da shell, le cose dipendono anche dal sistema operativo in uso, una breve ricerca mostra che esistono varie possibilità, p.e. keyboard od anche pynput, od altro ancora, in ogni caso, la gestione degli eventi di tastiera, in una shell testuale, è materia molto tosta, almeno per me, nella docs di pynput vi sono degli esempi interessanti utilizzanti i thread ... ma, magari, utenti più addentro sapranno dare indicazioni migliori.




Se, invece, l'intercettazione deve avvenire in un contesto gestito da un framwork grafico, p.e. tkinter, il discorso è notevolmente più facile, essendo i vari widget predisposti alla gestione degli eventi, nello specifico di tkinter dovresti decidere quale widget dovrebbe fare il binding, magari il frame della finestra, nel link vi è un esempio in tal senso proprio all'inizio.


Grazie Nuzzopippo per la riposta , allora io uso python 3 su linux (raspberry), la questione di cui sopra andrebbe utilizzata con un programma eseguito nella shell.

Ho visto i tuoi suggerimenti e ho provato a installare keyboard con




pip install keyboard




Il comando finisce l'esecuzione regolarmente, ma se io in un programma phyton importo keyboard .... ottengo un errore che dice che il modulo non c'è.




Come mai ?




Grazie
------
Alberto
... allora io uso python 3 su linux (raspberry), la questione di cui sopra andrebbe utilizzata con un programma eseguito nella shell.
Ho visto i tuoi suggerimenti e ho provato a installare keyboard con ...
Il comando finisce l'esecuzione regolarmente, ma se io in un programma phyton importo keyboard .... ottengo un errore che dice che il modulo non c'è.

Come mai ?
Quel "Come mai" è una domanda cui mi è difficile rispondere, perché dipende da come Tu hai installato keyboard.

Non conosco la distribuzione di raspberry ma quel pip install penso che operi per la versione 2.7 di python, nelle varie distro, correntemente, hanno operative due versioni di python, la 2.x e la 3.x e bisogna dare comandi specifici per la versione 3.




Comunque :


Il metodo più opportuno sempre e principalmente quando si sta "sperimentando" ed in particolar modo su linux è utilizzare un "Virtual Environment", con tale modalità non ho avuto difficoltà di sorta

NzP:~$ cd py_workspace/prove/p_v
NzP:~$ . bin/activate
(p_v) NzP:~$ python -m pip install keyboard
Collecting keyboard
  Downloading keyboard-0.13.5-py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 416 kB/s 
Installing collected packages: keyboard
Successfully installed keyboard-0.13.5
(p_v) NzP:~$ python
Python 3.8.2 (default, Jul 16 2020, 14:00:26) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyboard
>>> help('keyboard')

>>> exit()
(p_v) NzP:~$ python -m pip list
Package         Version  
--------------- ---------
certifi         2020.6.20
cycler          0.10.0   
keyboard        0.13.5   
kiwisolver      1.2.0    
matplotlib      3.3.1    
numpy           1.19.1   
Pillow          7.2.0    
pip             20.0.2   
pkg-resources   0.0.0    
pyparsing       2.4.7    
python-dateutil 2.8.1    
setuptools      44.0.0   
six             1.15.0   
(p_v) NzP:~$ 
così può non essere se lo installi a livello di sistema ordinario, sempre pessima idea in ambiente linux, perché potresti avere "complicazioni" dato che il sistema operativo utilizza ampiamente python, nelle versioni previste dalla distribuzione in uso.

Suggerirei, per prima cosa, di verificare il caso che Tu abbia installato la versione per python 2.x, per farlo apri una shell python 2.x (comando "python") ed al prompt prova ad importare keyboard, poi apri una shell python 3.x (comando "python3") e fai la stessa cosa, se non ti da errori in python2 e ti da errori in python3 vuol dire che lo hai installato per python 2.

Se è così NON installare direttamente in python 3 ma creati un venv con python3 e poi installalo nel venv attivato, come nel codice su, è la modalità più conveniente.




... se non è come ho supposto, ne parliamo.

Fatti non foste a viver come bruti...
... allora io uso python 3 su linux (raspberry), la questione di cui sopra andrebbe utilizzata con un programma eseguito nella shell.
Ho visto i tuoi suggerimenti e ho provato a installare keyboard con ...
Il comando finisce l'esecuzione regolarmente, ma se io in un programma phyton importo keyboard .... ottengo un errore che dice che il modulo non c'è.

Come mai ?
Quel "Come mai" è una domanda cui mi è difficile rispondere, perché dipende da come Tu hai installato keyboard.

Non conosco la distribuzione di raspberry ma quel pip install penso che operi per la versione 2.7 di python, nelle varie distro, correntemente, hanno operative due versioni di python, la 2.x e la 3.x e bisogna dare comandi specifici per la versione 3.




Comunque :


Il metodo più opportuno sempre e principalmente quando si sta "sperimentando" ed in particolar modo su linux è utilizzare un "Virtual Environment", con tale modalità non ho avuto difficoltà di sorta

NzP:~$ cd py_workspace/prove/p_v
NzP:~$ . bin/activate
(p_v) NzP:~$ python -m pip install keyboard
Collecting keyboard
  Downloading keyboard-0.13.5-py3-none-any.whl (58 kB)
     |████████████████████████████████| 58 kB 416 kB/s 
Installing collected packages: keyboard
Successfully installed keyboard-0.13.5
(p_v) NzP:~$ python
Python 3.8.2 (default, Jul 16 2020, 14:00:26) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import keyboard
>>> help('keyboard')

>>> exit()
(p_v) NzP:~$ python -m pip list
Package         Version  
--------------- ---------
certifi         2020.6.20
cycler          0.10.0   
keyboard        0.13.5   
kiwisolver      1.2.0    
matplotlib      3.3.1    
numpy           1.19.1   
Pillow          7.2.0    
pip             20.0.2   
pkg-resources   0.0.0    
pyparsing       2.4.7    
python-dateutil 2.8.1    
setuptools      44.0.0   
six             1.15.0   
(p_v) NzP:~$ 
così può non essere se lo installi a livello di sistema ordinario, sempre pessima idea in ambiente linux, perché potresti avere "complicazioni" dato che il sistema operativo utilizza ampiamente python, nelle versioni previste dalla distribuzione in uso.

Suggerirei, per prima cosa, di verificare il caso che Tu abbia installato la versione per python 2.x, per farlo apri una shell python 2.x (comando "python") ed al prompt prova ad importare keyboard, poi apri una shell python 3.x (comando "python3") e fai la stessa cosa, se non ti da errori in python2 e ti da errori in python3 vuol dire che lo hai installato per python 2.

Se è così NON installare direttamente in python 3 ma creati un venv con python3 e poi installalo nel venv attivato, come nel codice su, è la modalità più conveniente.




... se non è come ho supposto, ne parliamo.

Fatti non foste a viver come bruti...
Ciao @trescon




Dovresti precisare il contesto di esecuzione in cui vuoi intercettare la tastiera, cioè se lo devi intercettare da shell o da interfaccia grafica, le modalità sono molto diverse.




Se, come suppongo, lo devi intercettare da shell, le cose dipendono anche dal sistema operativo in uso, una breve ricerca mostra che esistono varie possibilità, p.e. keyboard od anche pynput, od altro ancora, in ogni caso, la gestione degli eventi di tastiera, in una shell testuale, è materia molto tosta, almeno per me, nella docs di pynput vi sono degli esempi interessanti utilizzanti i thread ... ma, magari, utenti più addentro sapranno dare indicazioni migliori.




Se, invece, l'intercettazione deve avvenire in un contesto gestito da un framwork grafico, p.e. tkinter, il discorso è notevolmente più facile, essendo i vari widget predisposti alla gestione degli eventi, nello specifico di tkinter dovresti decidere quale widget dovrebbe fare il binding, magari il frame della finestra, nel link vi è un esempio in tal senso proprio all'inizio.


Grazie Nuzzopippo per la riposta , allora io uso python 3 su linux (raspberry), la questione di cui sopra andrebbe utilizzata con un programma eseguito nella shell.

Ho visto i tuoi suggerimenti e ho provato a installare keyboard con




pip install keyboard




Il comando finisce l'esecuzione regolarmente, ma se io in un programma phyton importo keyboard .... ottengo un errore che dice che il modulo non c'è.




Come mai ?




Grazie

Malfunzionamento dell'editor (errore 404 d ngx) tornato indietro ho ripremuto "invia" si pregano i moderatori di eliminare questo post, grazie


--- Ultima modifica di nuzzopippo in data 2020-09-18 13:52:54 ---
Fatti non foste a viver come bruti...
Ciao @trescon




Dovresti precisare il contesto di esecuzione in cui vuoi intercettare la tastiera, cioè se lo devi intercettare da shell o da interfaccia grafica, le modalità sono molto diverse.




Se, come suppongo, lo devi intercettare da shell, le cose dipendono anche dal sistema operativo in uso, una breve ricerca mostra che esistono varie possibilità, p.e. keyboard od anche pynput, od altro ancora, in ogni caso, la gestione degli eventi di tastiera, in una shell testuale, è materia molto tosta, almeno per me, nella docs di pynput vi sono degli esempi interessanti utilizzanti i thread ... ma, magari, utenti più addentro sapranno dare indicazioni migliori.




Se, invece, l'intercettazione deve avvenire in un contesto gestito da un framwork grafico, p.e. tkinter, il discorso è notevolmente più facile, essendo i vari widget predisposti alla gestione degli eventi, nello specifico di tkinter dovresti decidere quale widget dovrebbe fare il binding, magari il frame della finestra, nel link vi è un esempio in tal senso proprio all'inizio.


Ciao, io ho provato sia keyboard sia pynput ma nessuno dei due funziona




keyboard ... puo' essere utilizzato solo con permessi di root e se cosi faccio mi dice che il modulo keyboard :




ModuleNotFoundError: No module named 'keyboard'




mentre se faccio pip list :




Package Version
----------------- -----------
arandr 0.1.9
asn1crypto 0.24.0
automationhat 0.2.0
blinker 1.4
blinkt 0.1.2
buttonshim 0.0.2
Cap1xxx 0.1.3
certifi 2018.8.24
chardet 3.0.4
Click 7.0
colorama 0.3.7
colorzero 1.1
configparser 3.5.0b2
cookies 2.2.1
cryptography 2.6.1
drumhat 0.1.0
entrypoints 0.3
enum34 1.1.6
envirophat 1.0.0
ExplorerHAT 0.4.2
Flask 1.0.2
fourletterphat 0.1.0
funcsigs 1.0.2
gpiozero 1.5.1
gyp 0.1
idna 2.6
ipaddress 1.0.17
itsdangerous 0.24
Jinja2 2.10
keyboard 0.13.5
keyring 17.1.1
keyrings.alt 3.1.1
MarkupSafe 1.1.0




--------




Per pynput invece la cosa è diversa, prende il tasto premuto ma non mi esegue le istruzioni quando premo un tasto specifico




def on_press(key):
    try:
        print('alphanumeric key {0} pressed'.format(
            key.char))
    except AttributeError:
        print('special key {0} pressed'.format(
            key))

def on_release(key):
    print('{0} released'.format(
        key))
    if key == keyboard.Key.esc:
        # Stop listener
        sys.exit() #return False
listener = keyboard.Listener(on_press=on_press,on_release=on_release)
listener.start()

Non ne vado fuori..... AIUTO !!

Grazie




------
Alberto
Ciao, io ho provato sia keyboard sia pynput ma nessuno dei due funziona
keyboard ... puo' essere utilizzato solo con permessi di root e se cosi faccio mi dice che il modulo keyboard :
ModuleNotFoundError: No module named 'keyboard'
mentre se faccio pip list : ...
...
Per pynput invece la cosa è diversa, prende il tasto premuto ma non mi esegue le istruzioni quando premo un tasto specifico
....
Non ne vado fuori..... AIUTO !!
Ciao, da un po' che guardo il post, dato che non c'è intervento ...




Che ritenessi "tosto" l'argomento, te lo avevo anticipato, ho provato le due librerie che avevo trovato ed indicato e mi son reso conto che non erano una buona indicazione, temo di averti fuorviato, Te ne chiedo scusa.




In effetti keyboard richiede privilegi di root, ho provato, per altro, a comprendere pynput, leggendo la docs e testando il codice di esempio ... ci son di mezzo X (l'ambiente grafico di Linux) ed i thread, oltre tutto, temo, un bel po' di "configurazione", discorso che ritengo in salita e non so quanto valga la pena affrontarlo, penso che dato che serve X tanto vale utilizzare un framework grafico e finirla li.

Ho cercato, per quanto possibile, in giro per vedere cosa c'è riguardo l'intercettazione della tastiera a linea di comando ... molta roba ma tutta "confusa", forse la possibilità più "chiara" sarebbero le librerie "curses" (una specie di simulazione di interfaccia grafica a linea di comando) ma nemmeno queste credo che siano una passeggiata.




... mi domando : cosa vuoi "realmente" realizzare?

Se ritieni, fai un esempio semplificato ma esaustivo dell'obiettivo che Ti poni, magari ragionandoci su si approda a qualcosa.


Fatti non foste a viver come bruti...
Ciao, io ho provato sia keyboard sia pynput ma nessuno dei due funziona
keyboard ... puo' essere utilizzato solo con permessi di root e se cosi faccio mi dice che il modulo keyboard :
ModuleNotFoundError: No module named 'keyboard'
mentre se faccio pip list : ...
...
Per pynput invece la cosa è diversa, prende il tasto premuto ma non mi esegue le istruzioni quando premo un tasto specifico
....
Non ne vado fuori..... AIUTO !!
Ciao, da un po' che guardo il post, dato che non c'è intervento ...




Che ritenessi "tosto" l'argomento, te lo avevo anticipato, ho provato le due librerie che avevo trovato ed indicato e mi son reso conto che non erano una buona indicazione, temo di averti fuorviato, Te ne chiedo scusa.




In effetti keyboard richiede privilegi di root, ho provato, per altro, a comprendere pynput, leggendo la docs e testando il codice di esempio ... ci son di mezzo X (l'ambiente grafico di Linux) ed i thread, oltre tutto, temo, un bel po' di "configurazione", discorso che ritengo in salita e non so quanto valga la pena affrontarlo, penso che dato che serve X tanto vale utilizzare un framework grafico e finirla li.

Ho cercato, per quanto possibile, in giro per vedere cosa c'è riguardo l'intercettazione della tastiera a linea di comando ... molta roba ma tutta "confusa", forse la possibilità più "chiara" sarebbero le librerie "curses" (una specie di simulazione di interfaccia grafica a linea di comando) ma nemmeno queste credo che siano una passeggiata.




... mi domando : cosa vuoi "realmente" realizzare?

Se ritieni, fai un esempio semplificato ma esaustivo dell'obiettivo che Ti poni, magari ragionandoci su si approda a qualcosa.



Grazie Nuzzopippo per il tuo interessamento, il mio progretto ha una scadenza .... fine novembre Tassativo.

In pratica io il programma lo faccio girare su un Raspberry , il quale si accenderà all'ora x di ogni giorno per poi spegnersi sempre all'ora x della stessa sera.

Il programma controlla un PRESEPIO, realizzato da degli appassionati (di presepe di paese) e appassionati di elettronica e informatica (io e il mio collega).

Il programma per la sua "complessità" (si certo per la complessità e non per la mio ignoranza :-) ) è stato suddiviso in più parti.

Avendo nel progetto 4 schede per le dissolvenze (alba, giorno, tramonto e notte) , avendo 2 schede rele per poter avere 16 uscite che controllano carichi sia in potenza (220v) sia a contatto pulito , e per ultima la scheda di interfaccia raspberry che pernette di controllare le suddette schede in rs-485 e gestisce 6 ingressi e 8 uscite gpio.

Aggiungo con un pelo di orgoglio che a scheda >raspberry di interfaccia, le 2 schede relè e le 4 schede dissolvente sono state INTERAMENTE progettate e realizzate da noi.(nulla di comprato e adatatto)


Ci sono 2 programmi che hanno l'interfaccia grafica con Tkinter che permettono di selezionare i tempi di intervento delle schede, poi c'è il programma che permette di testare i tempi delle varie accensioni (sempre in Tkinter) e poi c'è il programma in questione che è quello che parte quando il visitatore del presepio preme il tasto per l'avvio ed esegue le varie operazioni.

Questo non è dotato di interfacci tkinter perchè girera in loop almeno 12 ore al giorno e meno codice "complesso" c'è , meno problemi posso avere.

Questo programma parte con avvio automatico e gestisce attraverso impulso esterno lo spegnimento del raspberry stesso alla sera; a questo programma manca però una cosa fondamentale in fase di test .... POTERLO FERMARE.

Ecco a cosa mi serve quello che ho chiesto .... un comando che io durante il programma premendo un tasto (es. ESC) mi blocchi il programma mi permetta di fare le correzzioni del caso.

Non "chiedo molto" .... ma non trovo nulla che funzioni.

Spero di non aver stressato te egli altri utenti con "inutili " spiegazioni.

Detto questo .... chiedo/attendo un aiutino.

Grazie

------
Alberto
Questo programma parte con avvio automatico e gestisce attraverso impulso esterno lo spegnimento del raspberry stesso alla sera; a questo programma manca però una cosa fondamentale in fase di test .... POTERLO FERMARE.

Ecco a cosa mi serve quello che ho chiesto .... un comando che io durante il programma premendo un tasto (es. ESC) mi blocchi il programma mi permetta di fare le correzzioni del caso.

In fase di test "basterebbe" lanciare la procedura da shell ed interromperla con "CTRL+C"
Python 3.8.2 (default, Jul 16 2020, 14:00:26) 
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license()" for more information.
>>> import time
>>> actions = 0
>>> while True:
	actions += 1
	print('Eseguita azione', actions)
	time.sleep(3)

	
Eseguita azione 1
Eseguita azione 2
Traceback (most recent call last):
  File "<pyshell#8>", line 4, in <module>
    time.sleep(3)
KeyboardInterrupt
>>> 
Per quanto riguarda "il comando", personalmente ed alla base delle mie attuali conoscenze, lo darei dall'esterno ... una specie di "comando remoto" in sostanza, nel fine settimana cercherò di abbozzare un esempio di ciò che mi è venuto in mente.
Fatti non foste a viver come bruti...


Pagina: 1 2 Avanti



Esegui il login per scrivere una risposta.