텍스트 편집기를위한 간단한 행-열 카운터를 만들기 index
위해 tkinter.Text
위젯 의 기능을 사용하기로 결정했습니다 . 실제로이 index
함수는 인수로 전달 된 좌표의 행과 열을 나타내는 문자열을 반환합니다.
특히 effbot 웹 사이트에서 다음 cursor_pos = text.index(tkinter.INSERT)
과 같이 커서의 인덱스를 가져 오는 데 사용 하고 있습니다 .tkinter.INSERT
tkinter.INSERT는 삽입 커서에 해당합니다.
문제는 tkinter.INSERT
화살표로 커서를 이동할 때까지 마지막 커서 위치를 제공 하는 것 같습니다 (예 :).
다음은 행과 열의 수를 처리하는 함수입니다.
def on_key_pressed(self, event=None):
"""Docs """
if self.tpane is not None:
print(self.lines, self.columns)
self.tpane.update()
cursor_pos = self.tpane._tabs[self.tpane.selected()].text.index(tkinter.INSERT)
self.lines = int(cursor_pos.split('.')[0])
self.columns = int(cursor_pos.split('.')[1])
print(self.lines, self.columns)
self.line_c.config(text='Lines: ' + str(self.lines))
self.col_c.config(text='Columns: ' + str(self.columns))
self.update()
상황을 이해할 수 있을지 모르겠네요 ... 에디터에서 처음 글자를 입력 self.columns
하면 두 번째 글자를 쓸 때까지 변수가 1로 업데이트되지 않습니다 (0으로 유지됨). 여기서 1로 업데이트됩니다. 의 위에. 그러나 새 편지를 쓰지 않고 업데이트하는 트릭이 있습니다. 첫 글자를 쓴 후 화살표로 커서를 움직이면 self.columns
실제로 1로 업데이트됩니다 .
또 다른 문제는 존재하는 캐릭터를 삭제하려고 할 때입니다. 예를 들어, 나는 3 개 문자가있는 경우 (내가 있다고 가정 self.columns
3), 그리고 프레스 delete
, self.columns
설명 할 수 없을 갱신 4
, 나는이 시점에서, 다른 문자를 제거하려고하면, 그것은 3 업데이트합니다.
이 문제 self.lines
는 on_key_pressed
이벤트 핸들러 에도 존재 합니다. 이런 일이 일어나야하는지 잘 모르겠고, 그렇다면 뭔가 빠진 것입니다 ...
이는 사용자 정의 바인딩이 기본 제공 바인딩 전에 실행되고 실제로 위젯을 수정하고 커서 위치를 변경하는 기본 제공 바인딩이기 때문에 발생합니다.
bindtag를 활용하여 순서를 변경할 수 있습니다. 자세한 내용은 다음 질문을 참조하십시오. tkinter의 bindtag에 관한 기본 쿼리
bindtags를 변경하는 방법의 예는 다음 답변을 참조하십시오 : https://stackoverflow.com/a/3513906/7432
bindtags를 다루고 싶지 않다면 <KeyRelease>
. 기본 제공 바인딩은 키를 누를 때 발생 하므로 위젯이 업데이트 된 후 릴리스 바인딩이 항상 실행됩니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다