2013-06-14 3 views
2

위젯 (즉, 텍스트, 항목, 레이블)에 이진 정보를 표시하려고합니다. 이 경우 문자 '0'또는 '1'만 클릭하면 0과 1 사이를 전환 할 수 있습니다.개별 문자에 이벤트 바인드 tcl/tk

사용하려는 위젯과 마우스 이벤트를 개별 문자.

저는 TK쪽에 상당히 익숙하기 때문에 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.

+0

저는 Tk가 좋지 않지만 바인딩이나 위젯을 많이 만들지 않고 단일 캔버스 나 이미지를 만들고 클릭 한 위치를 기록하여 해당 픽셀을 변경합니다. – potrzebie

답변

4

가장 쉬운 두 위젯은 canvastext입니다. 캔버스를 사용하면 숫자 문자열을 단일 텍스트 항목으로 만들고 클릭 위치를 문자 색인으로 직접 변환하거나 각 문자를 고유 한 텍스트 항목으로 만들 수 있습니다. (각 캐릭터를 최소한의 노력으로 개별적으로 스타일화할 수 있고 클릭 할 수있게 만들 수 있지만, 레이아웃 측면에 약간의주의를 기울여야합니다.)

그러나 나는 텍스트 위젯이 더 적합 할 것입니다. 이를 통해 문자 범위에 태그를 설정할 수 있으며 이러한 태그는 바인딩 가능하고 스타일 할 수 있습니다.

pack [text .t -takefocus 0] 
set binstring "01011010" 
set counter 0 
foreach char [split $binstring ""] { 
    set tag ch$counter 
    .t insert end $char $tag 
    .t tag bind $tag <Enter> ".t tag configure $tag -foreground red" 
    .t tag bind $tag <Leave> ".t tag configure $tag -foreground black" 
    .t tag bind $tag <1> [list clicked .t $tag $counter] 
    incr counter 
} 
proc clicked {w tag counter} { 
    global binstring 
    # Update the display 
    set idx [$w index $tag.first] 
    set ch [expr {![$w get $idx]}] 
    $w delete $idx 
    $w insert $idx $ch $tag 
    # Update the variable 
    set binstring [string replace $binstring $counter $counter $ch] 
    # Print the current state 
    puts "binstring is now $binstring" 
} 
+0

만약 내가이 일을 실제로하고 있었다면, 디스플레이를 변수를 사용하여 슬레이브 (slaved) 시켜서 디스플레이를 업데이트하도록 var를 설정할 수 있습니다. 그러나 모든 런타임 업데이트가 GUI에서 오는 간단한 경우에는 필요하지 않습니다. –

+0

고마워. 그게 내가 찾고 있었던 것. 그 동안 라벨로 해결했는데, 이는 '읽기 전용'이고 텍스트는 사용자가 변경할 수 있기 때문입니다. 문자 당 라벨 하나. '변수에 대한 디스플레이 노예'란 무엇을 의미합니까? – sebs

관련 문제