2013-09-24 497 views
3

我正在寻找一种方法在tcl中暂停脚本(例如,在某些输出与“puts”之后)并等待用户按下之前继续输出剩余的文字。tcl暂停和等待按键继续

+0

您确定要将其构建到脚本中吗?有人可能希望将输出发送到一个文件或将其输出到“grep”,“sed”或其他任何地方。更好的解决方案是将脚本输出管道输出到“more”程序之一(Windows上可用)或“less”。 – 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 

链接到深入讨论on 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您的答案。提供美丽的代码。看到你的回答后,我想起了一个问题。如果我想让用户“按任意键”怎么办?不只是“输入”......这样的事情可能吗?我会开始这个问题作为一个新的线程,但对这种情况没有信心..是否有任何选择/方式? –

+0

感谢您使用此短代码,它使用Enter键非常有效。 – user2669068

0

Windows的潜在解决方案:

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

这也通知非ascii按键(如方向键,转义等)。

另一种解决方案是(该链接的感谢!)above 提出 多纳尔研究员的Raw Mode on Windows,这可以归纳为 这两行代码:

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

这不注意到逃生,箭头键等等(你可能需要稍后恢复控制台输入模式)。