2013-09-24 2 views
3

Я ищу способ в tcl для приостановки сценария (например, после некоторых выходов с «puts») и дождаться нажатия клавиши от пользователя, прежде чем продолжить вывод оставшийся текст.tcl приостановка и ожидание нажатия клавиши для продолжения

+0

Вы уверены, что хотите создать это в скрипте? Кто-то может захотеть отправить вывод в файл или передать его в 'grep',' sed' или что-то еще. Лучшее решение заключается в том, чтобы вывести сценарии в одну из программ «больше» (доступно также в Windows) или «меньше». – potrzebie

ответ

4

С благодарностью ответить Хай Ву, если вы на Unix-подобных системах с stty

proc anykey {{msg "Hit any key: "}} { 
    set stty_settings [exec stty -g] 
    exec stty raw -echo 
    puts -nonewline $msg 
    flush stdout 
    read stdin 1 
    exec stty $stty_settings 
    puts "" 
} 
puts 1 
anykey 
puts 2 

Ссылка на подробное обсуждение на Tcl wiki: Reading a single character from the keyboard using Tcl

+1

Выполнение того же самого в Windows требует использования пакета TWAPI, чтобы вы могли изменить режим терминала. Это [немного длинный комментарий] (http://wiki.tcl.tk/14693). –

7

Вы просто использовать gets для чтения из стандартного ввода:

proc pause {{message "Hit Enter to continue ==> "}} { 
    puts -nonewline $message 
    flush stdout 
    gets stdin 
} 

pause "Hurry, hit enter: "; # Sample usage 1 
pause;      # Sample usage 2, use default message 
+0

+1 для вашего ответа. Красивый код. Увидев ваш ответ, на мой вопрос пришел 1 вопрос. Что, если я хочу, чтобы пользователь «нажал любую клавишу»? а не просто «Ввод» ... Возможно ли такое? Я бы начал этот вопрос как новый поток, но не был уверен в таком сценарии. Есть ли какой-нибудь вариант/способ? –

+0

Благодарим вас за этот короткий код, он отлично работает с клавишей ввода. – user2669068

0

Потенциальное решение для Windows:

exec -ignorestderr [file join $env(windir) system32 cmd.exe] /c pause 

Это также относится к клавишам не-ascii (например, клавишам со стрелками, Escape и т. Д.).

Другим решением является Raw Mode on Windows предложенного Донала Fellows above (спасибо за ссылку!), Которые могут быть сведены в этих двух строки коды:

twapi::modify_console_input_mode stdin -lineinput 0 -echoinput 0 
read stdin 1 

Это не замечает побег, стрелки ключи и т. п. (и вам может понадобиться восстановить режим ввода консоли позже).