WXPYTHON의 WX.TextCtrl 컨트롤에서 스크롤 위치 / 범위를 얻으려면 어떻게해야합니까?

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

문제

우리가 개발중인 약간의 키트에서 데이터를 수신하는 작은 로깅 앱 (Wxpython으로 작성)이 있으며 스크롤 창에 텍스트를 표시하고 싶습니다. 그대로 텍스트 디스플레이에 wx.textctrl을 사용하고 있지만 스크롤 동작에 문제가 있습니다.

기본적으로 스크롤 바가 창의 맨 아래에 있으면 (예 : 들어오는 데이터의 끝) 더 많은 데이터를 추가하면보기를 앞으로 스크롤해야합니다. 그러나보기가 약간 스크롤 된 경우 (예 : 사용자가 오류 메시지와 같은 흥미로운 것을보고있는 경우) 더 이상 스크롤하지 않고 끝에 텍스트를 추가해야합니다.

지금은 두 가지 문제가 있습니다.

  1. 현재 스크롤 위치를 검색하는 방법을 해결할 수 없습니다 (getscrollpos ()에 대한 호출은 작동하지 않는 것 같습니다 - 단지 0).
  2. 스크롤 막대의 현재 범위를 검색하는 방법을 해결할 수 없습니다 (getScrollRange ()로 호출 1).

나는 조금씩 검색되었고 getscrollpos와 getscrollrange가 wx.textctrl에서 작동하지 않을 것을 제안하는 몇 가지 힌트가있는 것 같습니다. 이 분야에서 다른 경험이 있습니까? 문제를 해결하는 쉬운 방법이 있습니까? 아니면 내 자신의 wx.textctrl을 굴려야합니까?

도움이 되었습니까?

해결책

방금 간단한 예제를 테스트했습니다 (확인 GetScrollPos(0) 그리고 GetScrollRange(0) 안에 EVT_TEXT 이벤트 핸들러 wx.TextCtrl) 그리고 그것은 나에게 잘 작동합니다 - 그들은 각각 현재 표시된 선과 총 라인 수의 인덱스를 반환합니다.

아마도 문제는 당신의 wxpython 버전일까요? 나는 사용했다 :

>>> import wx
>>> wx.version()
'2.8.9.1 (msw-unicode)'

다른 팁

좋아요, 여기에 내가있는 곳이 있습니다.

import wx
from threading import Timer
import time

class Form1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.logger = wx.TextCtrl(self,5, "",wx.Point(20,20), wx.Size(200,200), \
                wx.TE_MULTILINE |  wx.TE_READONLY)# |  wx.TE_RICH2)

        t = Timer(0.1, self.AddText)
        t.start()

    def AddText(self):
        # Resart the timer
        t = Timer(0.25, self.AddText)
        t.start() 

        # Work out if we're at the end of the file
        currentCaretPosition = self.logger.GetInsertionPoint()
        currentLengthOfText = self.logger.GetLastPosition()
        if currentCaretPosition != currentLengthOfText:
            self.holdingBack = True
        else:
            self.holdingBack = False

        timeStamp = str(time.time())

        # If we're not at the end of the file, we're holding back
        if self.holdingBack:
            print "%s FROZEN"%(timeStamp)
            self.logger.Freeze()
            (currentSelectionStart, currentSelectionEnd) = self.logger.GetSelection()
            self.logger.AppendText(timeStamp+"\n")
            self.logger.SetInsertionPoint(currentCaretPosition)
            self.logger.SetSelection(currentSelectionStart, currentSelectionEnd)
            self.logger.Thaw()
        else:
            print "%s THAWED"%(timeStamp)
            self.logger.AppendText(timeStamp+"\n")

app = wx.PySimpleApp()
frame = wx.Frame(None, size=(550,425))
Form1(frame)
frame.Show(1)
app.MainLoop()

이 간단한 데모 앱은 거의 완벽하게 작동합니다. 사용자가 텍스트의 끝에 있지 않은 줄을 클릭하지 않으면 깔끔하게 스크롤됩니다. 그 후에는 잘 유지되고 여전히 텍스트를 선택할 수 있습니다 (참고 : 선택하지 않으면 선택을 선택하면 여전히 버그가 있습니다).

가장 큰 성가심은 "| wx.te_rich2"옵션을 시도하고 활성화하면 모두 배 모양이된다는 것입니다. 오류의 구문 강조 표시를하려면이 작업이 정말로 필요하지만 해당 옵션을 활성화 할 수 없다면 단색으로 파멸됩니다.

풍부한 편집 컨트롤에서 스크롤을 유지하는 방법에 대한 더 많은 아이디어가 있습니까?

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