2013-09-24 325 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 

這不注意到逃生,箭頭鍵等等(你可能需要稍後恢復控制檯輸入模式)。