J'ai un grand script TCL qui, à des points demande à l'utilisateur des questions comme, "S'il vous plaît entrer votre choix: A, B ou C?"Comment créer un délai d'attente pour l'entrée utilisateur dans TCL?
L'utilisateur doit taper le caractère et appuyer sur "Entrée" pour continuer à écrire. Y at-il de toute façon je peux automatiser cela dans TCL? Quelque chose comme, si l'utilisateur ne saisit rien dans les 10 secondes, par défaut l'option A sera prise et le script continuera? J'ai regardé autour et il semble que la seule façon dont TCL accepte les entrées est avec la commande "gets" - mais cela bloque et ne continuera pas jusqu'à ce que l'utilisateur entre quelque chose. Y a-t-il autre chose que je peux utiliser?
Réponse: La réponse de
Colin est ce qui m'a finalement conduit à la réponse que je cherchais (avec un peu de googler). Pour les personnes intéressées ici est le code que je fini par utiliser,
puts "Are you happy right now?"
puts "\(Press \"n\" or \"N\" within 5 seconds if you say \"No\"\)\nANSWER:"
global GetsInput
exec /bin/stty raw <@stdin
set id [after 5000 {set GetsInput "Y"}]
fileevent stdin readable {set GetsInput [read stdin 1]}
vwait ::GetsInput
after cancel $id
set raw_data $GetsInput
exec /bin/stty -raw <@stdin
uplevel #0 "unset GetsInput"
set user_input [string toupper $raw_data]
puts "\n"
if [ string equal $user_input "N"] {
puts "You are making me upset as well!!\n"
} else {
puts "I'm happy for you too !! (^_^)\n"
}
unset raw_data user_input
Ce que le ci-dessus est de poser une question et attendre 5 secondes pour un utilisateur appuyer sur la touche. Il acceptera seulement 1 clé comme entrée (l'utilisateur n'a pas besoin d'appuyer sur Entrée). Il imprime ensuite une réponse. La déclaration if est juste pour démontrer comment on pourrait prendre des décisions basées sur le code ci-dessus. Pour le meilleur ou pour le pire, il ne fonctionnera pas sans le support "stty" de votre système d'exploitation.
'package require Expect' –