Page 1 sur 1

Lire une entrée clavier

Posté : jeu. 20 déc. 2018 22:52
par charlie60
Bonjour,
Je bloque devant ce problème de lire une touche entrée au clavier pour ensuite déclencher une action .
J'utilise Raspbian et Python 3.5.3
Voila un script trouvé sur internet qui pourrait me convenir, mais il ne marche pas et je ne sais pas pourquoi !
J'ai ajouté à la fin le message d'erreur qui aparait quand je lance l'exécution du script.

#!/usr/bin/python3
# adapted from https://github.com/recantha/EduKit3-RC- ... eyboard.py

import sys, termios, tty, os, time
def getch():
fd=sys.stdin.fileno()
old_settings=termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old_settings)
return ch
button_delay=0.2
while True:
char = getch()
if(char == "s"):
print("Stop")
time.sleep(button_delay)

"""
Error message:
File "/home/pi/essai_02.py", line 16, in <module>
char = getch()
File "/home/pi/essai_02.py", line 6, in getch
fd=sys.stdin.fileno()
io.UnsupportedOperation: fileno
"""

Re: Lire une entrée clavier

Posté : dim. 23 déc. 2018 12:42
par Bud Spencer
La méthode est 'pythoyable' mais le code fonctionne.
test_py.png
test_py.png (46.71 Kio) Vu 592 fois

Re: Lire une entrée clavier

Posté : lun. 24 déc. 2018 11:34
par charlie60
Merci pour ton aide, ça fonctionne bien dans le Terminal, mais alors je ne comprends pas pourquoi ce même fichier ne fonctionne pas dans l'IDLE Raspbian.
Pour mes scripts j'utilise l'IDLE qui est un peu plus convivial que nano et je n'avais jamais eu de problème pour l'exécution.
Finalement le code était bon, sauf qu'il ne marche pas dans l'IDLE, c'est quand même BIZARRE !!!!
Si tu as une idée, je suis preneur.
Voici la dernière touche finale du script qui fonctionne bien et que je vais utiliser dans mon programme

#!/usr/bin/python3

import sys, termios, tty, os

def getch():
fd=sys.stdin.fileno()
old_settings=termios.tcgetattr(fd)
try:
tty.setraw(sys.stdin.fileno())
ch = sys.stdin.read(1)
finally:
termios.tcsetattr(fd,termios.TCSADRAIN,old_settings)
return ch

while True:
char = getch()
if char == "s":
print("Stop Motors")

if char == "q" or char == "Q":
print("*** Exit ***")
break

Re: Lire une entrée clavier

Posté : jeu. 27 déc. 2018 17:21
par Bud Spencer
Bha là je ne peux pas te répondre, je n’utilise pas IDLE (pis quoi encore :lol: ) mais je ne suis pas trop étonné que cela ne fonctionne pas vu que le script fait référence à sys.stdin.fileno, il est bien possible que l’interpréteur interactif d’Idle ait un peu de mal avec ça. En fait en lisant ton code, je ne voyais rien qui justifiait cette erreur, donc par curiosité je l’ai juste copié/collé dans un fichier et je l’ai lancé en cli pour valider mon analyse (qui s‘est avérée juste il va de soit :mrgreen: )