在一段时间tcl tk之后改变按钮的颜色

时间:2016-02-24 09:20:05

标签: tcl tk

我想在一段时间后改变单选按钮的颜色。 这是我试过的代码,

set field1 [radiobutton .field1 -disabledforeground green -state "disabled" ]
set field2 [radiobutton .field2 -disabledforeground red -state "disabled"]
set field3 [radiobutton .field3 -disabledforeground green -state "disabled"]

grid $field1 -row 0 -column 0
grid $field2 -row 0 -column 1
grid $field3 -row 0 -column 2

after 2000
$field1 configure -disabledforeground red
grid $field1 -row 0 -column 0

只有在更改颜色后才会打开窗口。

如何在运行时动态查看颜色变化?

1 个答案:

答案 0 :(得分:4)

这似乎可以解决问题。不过,我不确定它是否是最佳方式。

set field1 [radiobutton .field1 -disabledforeground green -state disabled]
set field2 [radiobutton .field2 -disabledforeground red -state disabled]
set field3 [radiobutton .field3 -disabledforeground green -state disabled]

grid $field1 $field2 $field3

bind .field1 <Map> [list after 2000 {changeDisabledColor %W red}]

proc changeDisabledColor {w color} {
    $w configure -disabledforeground $color
}

对此有一些想法:

  1. after 2000表示命令在返回之前会休眠两秒钟,在此期间,gui没有响应。 after 2000 脚本表示在两秒钟内安排事件后,该命令会立即返回。

  2. 当窗口被添加到要显示的窗口组时,会触发窗口Map事件,但在此窗口之前会计算其大小和位置。 AFAICT如果想要将某些配置计时到窗口的外观,这是一个很好的事件。

  3. .field1 <Map>的处理程序不必是对命令过程的调用:bind .field1 <Map> [list after 2000 {%W configure -disabledforeground red}]也应该有效。在我的例子中使用调用通常是个好主意,因为以后构建通常会更方便。

  4. 文档:afterbindgridlistradiobuttonset