具體的解決方案,按順序顯示多個屏幕,使用空格鍵切換到下一個屏幕,並在5秒鐘後自動切換屏幕。
首先,一些虛擬的定義來模擬屏幕。我建議使用這樣的命令程序來設置每個單獨的屏幕,但在實際的腳本中,它們當然會比這些更復雜。現在
grid [label .a] -sticky news
proc screen1 {} {.a configure -text 1}
proc screen2 {} {.a configure -text 2}
proc screen3 {} {.a configure -text 3}
proc screen4 {} {.a configure -text 4}
proc screen5 {} {.a configure -text 5}
,畫面切換機構(一個基本的,簡單的一個)。如果有,則nextScreen
命令取消正在運行的定時器。然後,一個全局計數器n
遞增(如果第一次不存在,則incr
將創建它並將其值設爲1)。然後我們檢查是否有一個叫screen$n
的命令:如果沒有,命令返回,結束序列。如果存在,它被調用,然後定時器設置爲在五秒鐘後調用nextScreen
。
proc nextScreen {} {
global n afterId
catch {after cancel $afterId}
incr n
if {[llength [info commands screen$n]] < 1} {
return
}
screen$n
set afterId [after 5000 nextScreen]
}
設置空格鍵激活nextScreen
。
bind . <space> nextScreen
呼叫nextScreen
啓動序列(或不這樣做,在這種情況下,空間需要按下啓動它)。
nextScreen
注:不需要無限循環(事件循環是這裏的無限循環)。我們也不需要採取任何動作來啓動事件循環:它會在窗口外殼中自動啓動。
年紀大了,原來的問題,一般的解決方案:
GUI應用
你可以通過調用
vwait forever
啓動事件循環(forever
只是一個可愛的變量名),但在GUI應用程序中,您不需要這樣做,因爲它將自動啓動。
如果您想通過單鍵輸入來控制腳本,通過使用fileevent stdin
很難獲得該功能。 OTOH,它真的很容易bind
鍵擊事件:
bind . <Key> {
exit
}
如果你想與剛剛鍵「K」打破,綁定到<Key-k>
代替。
具有循環結束20秒後自動是太容易了:
after 20000 exit
將其組合在一起:
bind . <Key> {
exit
}
after 20000 exit
while true {
puts -nonewline .
update
}
的puts
是否有表明環路是活的,在update
有以確保事件仍然處理。
CLI應用
對於CLI應用程序,我真的相信你應該使用的處置如果可能的。你的平臺在這裏很重要。
您需要設置stdin
不使用阻塞或緩衝:
chan configure stdin -blocking 0 -buffering none
然後你需要說服操作系統不使用緩衝以及(又名「原始輸入」)。在Unix/Linux上,我被告知有人使用stty
。自從Slackware在60多張軟盤上出現以來,沒有使用Linux,我真的不知道。
對於Windows解決方案,您可以使用twapi
來設置原始輸入模式。請注意,您需要刷新stdin
,否則它將從一開始就可讀。
(這是測試,並在Win7和Win10可與twapi
3.0.32。我不能肯定這是最好的解決方案。需要注意的是twapi
有它自己的命令,以取代fileevent
。)
package require twapi
twapi::modify_console_input_mode stdin -lineinput false -echoinput false
twapi::flush_console_input stdin
在下面的通用腳本之前運行此代碼。
否則,則代碼(按Enter
鍵停止循環立即,然後依次Enter
任何其他關鍵的需求,除非你已經成功地建立了原始輸入):
after 0 {
chan configure stdin -blocking 0 -buffering none
fileevent stdin readable {
exit
}
after 20000 exit
while true {
puts -nonewline .
update
}
}
vwait forever
文檔:after , bind, catch, chan, exit, fileevent, global, grid, if, incr, info, label (widget), llength, package, proc, puts, return, set, twapi (package), update, vwait, while
你永遠不進入事件循環,這是需要引起fileevents。 –
如何進入事件循環。 – chuk01
這是GUI還是CLI應用程序? – slebetman