如何让控制栏在 Tcl/Tk 中循环
how make control bar to loop for in Tcl/Tk
我需要你的帮助来创造一种能够控制债券的方法:
- 播放 |暂停 |停止
只有我没能用Play & Pause方法制作脚本。只是 Stop 太简单了,用 'break' 方法。
示例代码:
set waitvar 0
for {set i 0} {$i < 100} {incr i} {
puts "$i"
after 1000 set waitvar
waitvar vwait
set waitvar 0
}
如果有人可以帮助我在 Tcl/Tk 中提供一些教学示例。
我很感激,从现在开始。
如果谁能举个例子是Tcl:
与 switch
相同。诸如此类..
set pause "pausing"
switch pausing
$play {expr {1}}
$pause {expr {2}}
$stop {expr {3}}
现在如果谁能在 Tk 中给出一些例子:
通过按钮进行调用,便于理解。
这两者的示例不是强制性的,我只是建议两者之一 - Tcl 或 Tk
ATTENTION - For the answer to this question, I need it to be given for version Tcl/Tk 8.5
在 8.5 及之前的版本中,您最好使用异步编程。这需要一种与您正在使用的方法截然不同的方法(这与您在 8.6 及更高版本中使用协同程序所做的接近)。这是您需要的程序的草图;实现暂停的最简单方法是在暂停时不增加状态变量。
proc UpdateWaitvar {} {
global waitvar callback paused
if {$paused} {
set callback [after 100 UpdadteWaitvar]
} elseif {[incr waitvar] < 100} {
set callback [after 1000 UpdateWaitvar]
}
}
proc CancelWait {} {
global callback
after cancel $callback
}
proc StartWait {} {
global waitvar callback paused
set waitvar 0
set paused 0
set callback [after 1000 UpdateWaitvar]
}
proc TogglePause {} {
global paused
set paused [expr {! $paused}]
}
关于此的尴尬之处在于,您将“循环”编写为代码块,您 运行 在暂停的部分之间让其他事情发生,这感觉不像是自然的工作方式。
将 waitvar
变量绑定到 GUI 显示进度的任何位由您决定。
8.6 方法
在 8.6 中,您可以改用协程。
proc StartWait {} {
coroutine waiter apply {{} {
global waitvar paused callback
set paused 0
for {set waitvar 0} {$waitvar < 100} {incr waitvar} {
set callback [after 1000 [info coroutine]]
while {$paused} {
set callback [after 100 [info coroutine]]
}
}
}}
}
proc CancelWait {} {
global callback
after cancel $callback
rename waiter {}
}
# Also same TogglePause as before; it is, after all, just setting the right variable
我需要你的帮助来创造一种能够控制债券的方法:
- 播放 |暂停 |停止
只有我没能用Play & Pause方法制作脚本。只是 Stop 太简单了,用 'break' 方法。
示例代码:
set waitvar 0
for {set i 0} {$i < 100} {incr i} {
puts "$i"
after 1000 set waitvar
waitvar vwait
set waitvar 0
}
如果有人可以帮助我在 Tcl/Tk 中提供一些教学示例。
我很感激,从现在开始。
如果谁能举个例子是Tcl:
与 switch
相同。诸如此类..
set pause "pausing"
switch pausing
$play {expr {1}}
$pause {expr {2}}
$stop {expr {3}}
现在如果谁能在 Tk 中给出一些例子:
通过按钮进行调用,便于理解。
这两者的示例不是强制性的,我只是建议两者之一 - Tcl 或 Tk
ATTENTION - For the answer to this question, I need it to be given for version Tcl/Tk 8.5
在 8.5 及之前的版本中,您最好使用异步编程。这需要一种与您正在使用的方法截然不同的方法(这与您在 8.6 及更高版本中使用协同程序所做的接近)。这是您需要的程序的草图;实现暂停的最简单方法是在暂停时不增加状态变量。
proc UpdateWaitvar {} {
global waitvar callback paused
if {$paused} {
set callback [after 100 UpdadteWaitvar]
} elseif {[incr waitvar] < 100} {
set callback [after 1000 UpdateWaitvar]
}
}
proc CancelWait {} {
global callback
after cancel $callback
}
proc StartWait {} {
global waitvar callback paused
set waitvar 0
set paused 0
set callback [after 1000 UpdateWaitvar]
}
proc TogglePause {} {
global paused
set paused [expr {! $paused}]
}
关于此的尴尬之处在于,您将“循环”编写为代码块,您 运行 在暂停的部分之间让其他事情发生,这感觉不像是自然的工作方式。
将 waitvar
变量绑定到 GUI 显示进度的任何位由您决定。
8.6 方法
在 8.6 中,您可以改用协程。
proc StartWait {} {
coroutine waiter apply {{} {
global waitvar paused callback
set paused 0
for {set waitvar 0} {$waitvar < 100} {incr waitvar} {
set callback [after 1000 [info coroutine]]
while {$paused} {
set callback [after 100 [info coroutine]]
}
}
}}
}
proc CancelWait {} {
global callback
after cancel $callback
rename waiter {}
}
# Also same TogglePause as before; it is, after all, just setting the right variable