2011-01-20 6 views
1

안녕, 얘들 아,출력 읽기 전용, wx.textctrl로 입력 편집 가능?

나는 소프트웨어 구성, 시작 및 상호 작용을위한 GUI를 개발하기 위해 wxpython을 사용하고 있습니다. GUI 내부에 내장 된 CLI 셸 창 (예 : pycrust)과 같은 것이 장기 실행 백그라운드 프로세스와 상호 작용하기를 원합니다. 이 셸 창을 통해 입력을 제공하고 출력을이 창에 인쇄 할 수 있습니다. 현재 코드가 잘 작동합니다. 그러나 wx.TextCtrl은 단순히 편집 가능한 텍스트 윈도우이므로 편집 스타일의 문제가 있습니다. 예를 들어 이전 텍스트 문자를 덮어 쓰거나 제거하거나 새 입력을 어느 위치에서나 입력 할 수 있습니다. 이것은 바람직하지 않습니다.

wx.TextCtrl을 쉘 창처럼 만들려면 어떻게해야합니까? 즉, 입력을 편집 가능한 상태로 유지하면서 출력을 읽기 전용으로 만듭니 까? 예 :

1) 새 명령을 입력하면 위치가 프롬프트 이후에만 시작됩니다.

2) 사용자는 이전 출력 텍스트를 변경하거나 바꿀 수 없습니다. 상호 작용을 위해 특정 제한을 적용하고 싶습니다.

저주 프롬프트를 수정하는 방법이 있습니까? 그렇다면 사용자가 저주를 이동할 기회가 없으므로 내 문제가 해결됩니다.

텍스트의 특정 부분 (출력 및 프롬프트)을 읽기 전용으로 설정할 수있는 방법이 있습니까?

또 다른 해결책은 9000의 대답 덕분에 상단 창의 출력을 위해 StaticTextCtrl 또는 readonly TextCtrl을 만들고, 왼쪽 하단 영역에 ">>>"프롬프트를 표시하고 보이지 않는 테두리를 편집 할 수 있습니다 입력을 위해 오른쪽 하단 영역에 창 또는 입력 대화 상자).

제안 사항? 더 좋은 선택이 있습니까? 감사합니다.

답변

1

일종의 입력 버퍼를 사용할 수 있습니다.

TextCtrl에서 각 wx.EVT_KEY_DOWN 이벤트를 캡처합니다. 캐릭터를 생성하는 키 스트로크 인 경우이를 버퍼에 추가하고 통과 시키십시오. 백 스페이스 인 경우 버퍼에서 마지막 문자를 제거하고 허용하거나 버퍼에 문자가 남아 있지 않으면 허용하지 않습니다. 이렇게하면 현재 줄에서 명령 프롬프트를 보호 할 수 있습니다.

또한 커서 위치를 변경할 수있는 각 키보드 또는 마우스 이벤트를 처리해야합니다. 사용자가 현재 줄 안에서 커서를 이동하거나 이전 줄로 이동할 수 없도록하려면 화살표 키, 집, 끝, 페이지 위로, 페이지 아래로, 마우스 클릭 등을 감지하고 취소해야합니다. 완전히 잠그는 것은 힘들 수 있습니다.방지 키 입력에 대한

예 :

# inside your Frame init function... 
    self.text = wx.TextCtrl(self.panel, wx.ID_ANY, style=wx.TE_MULTILINE) 
    self.text.Bind(wx.EVT_KEY_DOWN, self.OnKey) 
    # ... 

def OnKey(self, evt): 
    # keycodes for arrow keys, page up/down 
    KEYS_TO_CANCEL = [314, 315, 316, 317, 366, 367] 

    keycode = evt.GetKeyCode() 

    if keycode in KEYS_TO_CANCEL: 
     print('Cancelled!') 
    else: 
     evt.Skip() 

행운을 빕니다!

1

저희 제품에서는 콘솔이 두 개의 편집 창이 얇은 선으로 구분되어 있습니다. 위쪽 창은 출력 창이며 읽기 전용입니다. 하단 창을 편집 할 수 있습니다. 명령을 작성하고 제출하면 명령이 하단 창에서 제거되고 명령의 출력과 함께 상단 창으로 이동합니다.

현재 편집중인 명령을 제거하지 않고 상단 창을 클릭하고, 항목을 선택하거나, 위로 스크롤 할 수 있습니다. 그런 다음 아래쪽 창을 클릭하거나 아무 키나 누르면 아래쪽 창으로 돌아가며 다음 명령을 계속 진행합니다.

+0

안녕하세요, 9000, 답변 해 주셔서 감사합니다. 아래쪽 창을 편집 할 수있는 경우, 사용자는 아래쪽 창이 저주 프롬프트없이 완전한 빈 창이 아닌 경우 "백 스페이스"로 프롬프트를 제거 할 수 있습니다. 솔직히 솔직히 말해서,이 분리 된 창을 둘러싼 솔루션의 외관 및 사용자 느낌에 대해 궁금합니다. pycrust 또는 shell을 살펴 본다면 사용자가 사용하기에 훨씬 편합니다. 어쨌든, 고맙다. – pepero

1

표시 할 때마다 프롬프트의 위치를 ​​추적하면됩니다. 모든 키 누르기와 놓기를 가로 채고, 무엇이든지 프롬프트가 변경되기 전에 텍스트가 나타나면 그 이벤트를 거부하십시오. 그리 어렵지는 않습니다. 모든 텍스트 수정 이벤트를 캡처하려면 약간의주의와 노력이 필요합니다.

+0

안녕하세요, Bryan, 대답하시는 것도 아주 좋습니다. 나는 그것을 upclick. 그러나 robots.jpg는 구체적인 코드를 제공합니다.이 코드는 수용 가능한 대답으로 넣습니다. 모두 고마워. – pepero

관련 문제