위젯 (즉, 텍스트, 항목, 레이블)에 이진 정보를 표시하려고합니다. 이 경우 문자 '0'또는 '1'만 클릭하면 0과 1 사이를 전환 할 수 있습니다.개별 문자에 이벤트 바인드 tcl/tk
사용하려는 위젯과 마우스 이벤트를 개별 문자.
저는 TK쪽에 상당히 익숙하기 때문에 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.
위젯 (즉, 텍스트, 항목, 레이블)에 이진 정보를 표시하려고합니다. 이 경우 문자 '0'또는 '1'만 클릭하면 0과 1 사이를 전환 할 수 있습니다.개별 문자에 이벤트 바인드 tcl/tk
사용하려는 위젯과 마우스 이벤트를 개별 문자.
저는 TK쪽에 상당히 익숙하기 때문에 누군가가 올바른 방향으로 나를 가리킬 수 있기를 바랍니다.
가장 쉬운 두 위젯은 canvas과 text입니다. 캔버스를 사용하면 숫자 문자열을 단일 텍스트 항목으로 만들고 클릭 위치를 문자 색인으로 직접 변환하거나 각 문자를 고유 한 텍스트 항목으로 만들 수 있습니다. (각 캐릭터를 최소한의 노력으로 개별적으로 스타일화할 수 있고 클릭 할 수있게 만들 수 있지만, 레이아웃 측면에 약간의주의를 기울여야합니다.)
그러나 나는 텍스트 위젯이 더 적합 할 것입니다. 이를 통해 문자 범위에 태그를 설정할 수 있으며 이러한 태그는 바인딩 가능하고 스타일 할 수 있습니다.
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"
}
만약 내가이 일을 실제로하고 있었다면, 디스플레이를 변수를 사용하여 슬레이브 (slaved) 시켜서 디스플레이를 업데이트하도록 var를 설정할 수 있습니다. 그러나 모든 런타임 업데이트가 GUI에서 오는 간단한 경우에는 필요하지 않습니다. –
고마워. 그게 내가 찾고 있었던 것. 그 동안 라벨로 해결했는데, 이는 '읽기 전용'이고 텍스트는 사용자가 변경할 수 있기 때문입니다. 문자 당 라벨 하나. '변수에 대한 디스플레이 노예'란 무엇을 의미합니까? – sebs
저는 Tk가 좋지 않지만 바인딩이나 위젯을 많이 만들지 않고 단일 캔버스 나 이미지를 만들고 클릭 한 위치를 기록하여 해당 픽셀을 변경합니다. – potrzebie