在单选按钮tcl tk中设置纯色

时间:2016-02-25 11:48:37

标签: tcl tk

我想要" LED"一种紧挨着放置的单选按钮。 我使用此命令设置颜色并禁用状态。

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

grid .field1 -row 0 -column 1
grid .field2 -row 0 -column 2
grid .field3 -row 0 -column 3

我想要像某种类似的东西。填充纯绿色并关闭单选按钮内的指示灯。

我试过" -indicatoron"设置为false。它仍然无法正常工作。

我的应用程序将如下所示, enter image description here

代码:

proc changeDisabledColor {w color} {
    puts "gng inside"
    $w configure -disabledforeground $color
}

set rowList [list "row1" "row2" "row3" "row4" "row5" "row6"]
set colList [list "1" "2" "3" "4" "5" "6"]

label .textNames -text "Description"
grid .textNames -row 0 -column 0
foreach temItem $colList {
    label .field$temItem -text "col $temItem"
    grid .field$temItem -row 0 -column $temItem
}

set rowIndex 1

foreach item $rowList {
    set colIndex 0
    label .$item -text "$item"
    grid .$item -row $rowIndex -column $colIndex
    foreach temCol $colList {
        set frameId "frame_$item\_$temCol"
        frame .$frameId -borderwidth 2 -relief ridge
        grid .$frameId -row $rowIndex -column [expr $colIndex + 1]
        radiobutton .$frameId.field1 -disabledforeground green -state "disabled"
        radiobutton .$frameId.field2 -disabledforeground red -state "disabled"
        radiobutton .$frameId.field3 -disabledforeground green -state "disabled"

        grid .$frameId.field1 -row $rowIndex -column [expr $colIndex + 1]
        grid .$frameId.field2 -row $rowIndex -column [expr $colIndex + 2]
        grid .$frameId.field3 -row $rowIndex -column [expr $colIndex + 3]
        incr colIndex
    }
    incr rowIndex
}

bind .frame_row3_2.field3 <Map> [list after 10000 {changeDisabledColor %W blue}]

预期产出:

enter image description here

是否可以使单选按钮看起来像这样?

1 个答案:

答案 0 :(得分:1)

首先,您要做的是不可移植。它不适用于所有平台,其中一些平台覆盖了radiobutton看起来非常彻底的方式。您最好使用标签并在其中配置图像。除了...

其次,看起来它会创建大量的小部件。这通常表明你没有以正确的方式做事。比如...

第三,使用画布并不困难,这既有效又有灵活性。

pack [canvas .c]

# Some helper procedures
proc makeClickableDot {x y bgVariable callback} {
    upvar #0 $bgVariable background
    set coords [list $x $y [expr {$x+10}] [expr {$y+10}]]
    set id1 [.c create oval $coords -fill $background -outline grey75]
    set id2 [.c create arc $coords -style arc -start 45 -extent 180 -outline black]
    .c bind $id1 <1> $callback
    .c bind $id2 <1> $callback
    trace add variable background write [list clickableDotWrite $bgVariable $id1]
}
proc clickableDotWrite {bgVariable id args} {
    upvar #0 $bgVariable background
    .c itemconf $id -fill $background
}

# Now we can just make our variables and dots
set rowList [list "row1" "row2" "row3" "row4" "row5" "row6"]
set colList [list "1" "2" "3" "4" "5" "6"]

set Y 10
foreach row $rowList {
    set X 10
    foreach col $colList {
        set cell($row,$col,1) green
        # It's a dumbass callback!
        makeClickableDot $X $Y cell($row,$col,1) [list set cell($row,$col,1) red]
        incr X 15
        set cell($row,$col,2) blue
        makeClickableDot $X $Y cell($row,$col,2) [list set cell($row,$col,2) yellow]
        incr X 15
        set cell($row,$col,3) magenta
        makeClickableDot $X $Y cell($row,$col,3) [list set cell($row,$col,3) cyan]
        incr X 15
    }
    incr Y 15
}

好的,非常色彩缤纷,你需要做更多的工作来调整它你想要的方式(我没有完全固定外观,回调是愚蠢的,你可能需要一个第二个数组保持某种状态)但它是它的核心所有你需要做的就是设置它是操纵变量。跟踪负责反映对GUI的更改。哪个好,以及Tk应该如何在大部分时间工作。