2014-07-10 2 views
1

사용자를 제한하기 위해 Tk Text widget에 대한 바인딩을 만들려고합니다. 줄의 첫 번째 문자를 삭제할 수 없습니다.이 문자는 터미널에서와 같이 프롬프트의 일종으로 사용됩니다.텍스트 위젯 색인으로 비정상적으로 작동합니까? (Tcl/Tk)

그것은하지만 어떤 이유로, 사용자는 라인의 첫 번째 문자를 삭제를 허용하지 않습니다 측면에서 작동
bind .text <BackSpace> { 
    if{[.text index insert] == [.text index {insert linestart+1c}]} { 
     break; 
    } 
} 

, 그것은 또한 삭제에서 사용자를 중지합니다)

여기

내가 거의이 달성하고있어 방법 라인의 아홉 번째 문자뿐! 예를 들어 : 그 줄의 끝에서 지금 백 스페이스를 누르면

>hello world! 

은 삭제합니다

헬로 법과까지

후 그만! 'r'다음에 오는 문자로 이동하여 삭제를 계속하려면 왼쪽 화살표를 누른 다음, 당연히 당근을 삭제하지 않아도됩니다. 왜 이런 일이 일어나야하는지 알지 못합니다. 누군가 내 실수를 지적하거나 내가 원하는 것을 성취 할 수있는 더 좋은 방법을 알릴 수 있다면 좋을 것입니다.

답변

3

[.text index insert]1.10의 색인을 제공하고 [.text index {insert linestart+1c}]1.1의 색인을 제공합니다.

이들은 숫자 상으로 동일하며, 가능한 경우 모두 ==은 숫자 평등을 사용하기를 좋아합니다.

bind .text <BackSpace> { 
    if {[.text compare insert == {insert linestart+1c}]} { 
     break 
    } 
} 

(나는 당신이 실제로 설정하여 아마, 당신의 전반적인 목표는 다른 방식으로 일을 더 나을 것 같아요 :

수정 프로그램은 아마도 다음과 같이 텍스트 위젯의 compare 방법을 사용하는 것입니다 보존 할 텍스트의 태그이며 삭제하기 전에 삭제할 텍스트가 있는지 여부를 삭제하기 전에 검사합니다. 그러나 이것은 매우 다른 접근 방법입니다.)

+0

감사합니다. 나는 ==의 내부 메커니즘과 색인 생성이 어떻게 작동하는지 이해하지 못했습니다. 당신은 많은 도움이되었습니다. – Grandclosing