2017-01-11 9 views
1

다양한 로그 데이터가 포함 된 TextCtrl이 있습니다. 사용자가 찾을 문자열을 검색 할 수있는 EditText 필드가있는 경우 찾기 버튼을 클릭하여 단어를 찾아 강조 표시합니다 로그에 있습니다. 브라우저에서 표준 찾기/하이라이트/메모장 등Python TextCtrl 검색 및 강조 표시 기능

이미 작동합니까가 성공적으로 사용자의 단어를 강조 코드, 그러나 내가 구현하고자하는 것이없는 비트의 몇 가지가 있습니다 :

  • 동일한 단어를 검색하고 다음 단어를 강조 표시 할 수있는 능력 예 : '다음 찾기' 편집 : 이것은 아래 코드로 '다음 찾기'버튼을 추가하여 해결되었습니다. 이 카운트는 다음 강조 표시를 모두 로그 끝까지가 아니라 1 단어로 제한합니다.
  • 그것을 동일한 단어, 또는 새로운 단어
  • 시작 될 새로운 단어를 검색하는 현재 단어를 유엔 강조 위치 0 (데이터의 정상) 새로운 단어를 EDIT 찾고하다면 : 데프

    def findTxt(self,e): 
    global wordPos 
    newstring = self.logTxt.GetValue() 
    for i in range(self.progressBox.GetNumberOfLines()): 
        line = self.progressBox.GetLineText(i) 
        if newstring in line: 
         startPos = self.progressBox.GetValue().find(newstring) 
         endPos = startPos + len(newstring) 
         wordPos = endPos 
         self.progressBox.Bind(wx.EVT_SET_FOCUS, self.highlightText(startPos, endPos)) 
         startPos = 0 
         self.findNextBtn.Enable() 
    
    def findNext(self,e): 
    global wordPos 
    newstring = self.logTxt.GetValue() 
    count = 0 
    for i in range(self.progressBox.GetNumberOfLines()): 
        if count == 0: 
         line = self.progressBox.GetValue() 
         if newstring in line: 
          startPos = self.progressBox.GetValue().find(newstring, wordPos) 
          endPos = startPos + len(newstring) 
          wordPos = endPos 
          self.progressBox.Bind(wx.EVT_SET_FOCUS, self.highlightText(startPos, endPos)) 
          count = 1 
    
    
    def highlightText(self, pos, size): 
    self.progressBox.SetStyle(pos, size, wx.TextAttr("black", "turquoise")) 
    self.progressBox.SetInsertionPoint(pos) 
    
  • 모든 기준이 충족 된

답변

0

findTxt 내부의 startPos 값을 재설정하여 해결 아래 WX 검색 및 하이라이트 기능에 대한 새로운 전체 코드. 그것은 예쁘지 않지만 작동합니다.

  • 같은 단어를 검색하고 다음 단어가 강조해야 할 수있는 능력 예 :

편집 '다음 찾기': 이것은에 추가하여 해결 된 아래로 버튼 '다음 찾기' 암호. 이 카운트는 다음 하이라이트를 모두 데이터 끝까지가 아니라 1 단어로 제한합니다.

  • 해제 하이라이트 새로운 단어를 검색하는 현재 단어, 그것을 동일한 단어, 또는 새로운 단어 수

EDIT : 값을 보유 개의 새로운 전역 변수를 생성함으로써 해결 새로운 단어를 검색 할 경우 기존 위치와 단어의 길이, 그리고 새로운 단어를 발견하기 전에/블랙, 화이트로 하이라이트를 recolouring의

  • 0 (데이터의 위)의 시작 위치
  • 01 23,516,

EDIT :는 def findTxt 내부

global wordPos 
wordPos,oldPos = '','' 

#wx widgets 
self.progressBox = wx.TextCtrl(panelLog, style=wx.TE_MULTILINE|wx.TE_READONLY|wx.TE_RICH2) 
    hBox2.Add(self.progressBox, 5, flag=wx.EXPAND) 
    vBox.Add(hBox2, 2, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=10) 

    self.logTxt = wx.TextCtrl(panelLog, style=wx.TE_RICH) 
    hBox3.Add(self.logTxt, 1, flag=wx.LEFT, border=5) 

    self.findBtn = wx.Button(panelLog, -1, "Find") 
    self.Bind(wx.EVT_BUTTON, self.findTxt, self.findBtn) 
    hBox3.Add(self.findBtn, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=3) 

    self.findNextBtn = wx.Button(panelLog, -1, "Find Next") 
    self.findNextBtn.Disable() 
    self.Bind(wx.EVT_BUTTON, self.findNext, self.findNextBtn) 
    hBox3.Add(self.findNextBtn, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=3) 
    vBox.Add(hBox3, 0, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=10) 

#method code 
def findTxt(self,e): 
    global wordPos, oldPos 
    newstring = self.logTxt.GetValue() 
    if wordPos: 
     self.progressBox.SetStyle(oldPos, wordPos, wx.TextAttr("black", "white")) 
    for i in range(self.progressBox.GetNumberOfLines()): 
     line = self.progressBox.GetLineText(i) 
     if newstring in line: 
      startPos = self.progressBox.GetValue().find(newstring) 
      endPos = startPos + len(newstring) 
      wordPos = endPos 
      oldPos = startPos 

      self.progressBox.Bind(wx.EVT_SET_FOCUS, self.highlightText(startPos, endPos)) 
      startPos = 0 
      self.findNextBtn.Enable() 


def findNext(self,e): 
    global wordPos, oldPos 
    newstring = self.logTxt.GetValue() 
    self.progressBox.SetStyle(oldPos, wordPos, wx.TextAttr("black", "white")) 
    count = 0 
    for i in range(self.progressBox.GetNumberOfLines()): 
     if count == 0: 
      line = self.progressBox.GetValue() 
      if newstring in line: 
       startPos = self.progressBox.GetValue().find(newstring, wordPos) 
       endPos = startPos + len(newstring) 
       wordPos = endPos 
       oldPos = startPos 
       self.progressBox.Bind(wx.EVT_SET_FOCUS, self.highlightText(startPos, endPos)) 
       count = 1 
를 startPos 값을 재설정함으로써 해결