2017-01-11 1 views
1

Ich habe eine TextCtrl, die verschiedene Protokolldaten enthält, ich habe auch ein EditText-Feld, in dem der Benutzer nach einer Zeichenfolge suchen kann, und klicken Sie dann auf die Schaltfläche Suchen, um das Wort zu finden und zu markieren ist in den Protokollen gefunden. Ihre Standardsuche/highlight in Browser/Notepad usw.Python TextCtrl Such- und Highlight-Funktionalität

Der Code Ich habe bereits funktioniert und zeigt erfolgreich das Wort des Benutzers, aber es gibt ein paar Bits fehlen, dass ich implementieren möchte:

  • Die Fähigkeit, das gleiche Wort zu suchen, und das nächste Wort hervorgehoben zu haben, z. B. ein 'Find Next' EDIT: Dies wurde durch Hinzufügen einer 'Find Next' Schaltfläche mit dem folgenden Code gelöst. Der Zähler begrenzt das nächste Highlight auf 1 Wort und nicht alle bis zum Ende des Protokolls.
  • das aktuelle Wort Un-Highlight, wenn ein neues Wort gesucht wird, ist es das gleiche Wort sein, oder ein neues Wort
  • Starten Sie die Position auf 0 (oben auf der Daten), wenn ein neues Wort EDIT Suche : gelöst, indem im Inneren des findTxt def

    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) 
    

Antwort

0

Alle Kriterien erfüllt wurden die startPos Wert zurückzusetzen: New vollständigen Code für wx suchen und markieren Funktionalität unten. Es ist nicht schön, aber es funktioniert. ‚Find Next‘ Dieses in einem gelöst wurde durch Zugabe mit dem unten:

  • Die Möglichkeit, das gleiche Wort zu suchen, und haben das nächste Wort zB markiert ein

EDIT ‚Find Next‘ Code. Die Zählung begrenzt das nächste Highlight auf 1 Wort und nicht alle bis zum Ende der Daten.

  • Un-Highlight das aktuelle Wort, wenn ein neues Wort gesucht wird, ist es das gleiche Wort sein, oder ein neues Wort

EDIT: gelöst, indem zwei neue globale Variablen zu schaffen, die den Wert halten die alten Position und Länge des Wortes, und dann Umfärben die Markierung auf schwarz/weiß, bevor neue Wortfindungs ​​

  • Starten Sie die Position auf 0 (oben der Daten), wenn ein neues Wort
  • 01 gesucht

EDIT: gelöst, indem der Wert innerhalb des startPos findTxt Zurücksetzen def

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