이벤트 핸들러에서 wxrichtextctrl의 커서 위치를 변경하는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com/questions/622417

문제

내 응용 프로그램에 RichTextCtrl이 있습니다. EVT_KEY_DOWN. 실행 된 코드는 다음과 같습니다.


def move_caret(self):
    pdb.set_trace()
    self.rich.GetCaret().Move((0,0))
    self.Refresh()


def onClick(self,event):
    self.move_caret()
    event.Skip()

부자 내 RichTextCtrl입니다.

내가하고 싶은 일은 다음과 같습니다.

  • 각 키 프레스에서 컨트롤에 키를 추가하십시오 (기본 동작).

  • 컨트롤의 시작 부분에서 첫 번째 위치에서 커서를 움직입니다.

실제로하는 일은 다음과 같습니다.

  • 컨트롤에 키를 추가합니다

  • Caret 위치를 검사했으며 디버거는 0,0에 위치하고 있지만 컨트롤에서 현재 위치에서 깜박입니다 (Key + 1을 누르기 전의 위치).

여기에 잘못된 것이 있습니까? 내가 잘못하고있는 일이 있어야합니다.

도움이 되었습니까?

해결책

분명히 코드에는 두 가지 문제가 있습니다.

  1. 당신은 듣습니다 EVT_KEY_DOWN, 아마도 이전에 처리 될 것입니다 EVT_TEXT, 기본 핸들러가 커서 위치를 설정합니다.

  2. 당신은 수정합니다 Caret 사용하는 대신 객체 SetInsertionPoint 케어를 움직이고 다음 문자가 주어진 장소에 나타나는 방법.

따라서 작업 예제 (테스트했으며 원하는대로 작동합니다)는 다음과 같습니다.

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_TEXT, self.onClick)

def onClick(self, event):
    self.rich.SetInsertionPoint(0) # No refresh necessary.
    event.Skip()

편집하다: 텍스트를 마지막에 추가하려면 커서가 처음에 남아있게하려면 (주석 참조) 사실을 활용할 수 있습니다. EVT_KEY_DOWN 전에 처리되었습니다 EVT_TEXT (문자 추가 후에 처리됩니다). 따라서 이벤트 순서는 다음과 같습니다.

  1. 핸들 EVT_KEY_DOWN
  2. 현재 삽입 지점에 문자를 추가하십시오
  3. 핸들 EVT_TEXT

처리기 추가 EVT_KEY_DOWN 그것은 실제로 캐릭터를 추가하기 직전에 삽입 지점을 끝까지 움직입니다. 따라서 앞에서 언급 한 코드 외에도 다음을 작성하십시오.

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)

def onKeyDown(self, event):
    self.rich.SetInsertionPointEnd()
    event.Skip()

그런데, event.Skip() 다음 이벤트 핸들러를 즉시 호출하지 않으면 깃발을 설정합니다. event 이벤트 프로세서 가이 처리기 후 이벤트 전파를 중지할지 여부를 알 수 있도록 객체.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top