wxPython TextCtrl搜索和突出显示功能



我有一个TextCtrl,它包含各种日志数据,我还有一个EditText字段,用户可以在其中搜索要查找的字符串,然后单击"查找"按钮来定位并突出显示在日志中找到的单词。您的标准查找/突出显示在浏览器/记事本等

我的代码已经工作了,并成功地突出了用户的单词,但我想实现的还有几个地方:

  • 搜索同一个单词并突出显示下一个单词的能力,例如"查找下一个"> 编辑:通过添加带有以下代码的"查找下个"按钮解决了此问题。计数将下一个高亮显示限制为1个单词,而不是所有单词都限制在日志末尾
  • 搜索新单词时取消突出显示当前单词,无论是同一单词还是新单词
  • 如果搜索新词,则从0(数据顶部)开始位置 编辑:通过重置findTxtdef 内的startPos值来解决

    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)
    

符合所有标准:wx搜索的新完整代码,并在下面突出显示功能。它不漂亮,但很管用。

  • 搜索同一个单词并突出显示下一个单词的能力,例如"查找下一个">

编辑:通过添加带有以下代码的"查找下一个"按钮解决了此问题。计数将下一个高亮显示限制为1个单词,而不是所有单词都限制在数据末尾

  • 在搜索新词时取消突出显示当前单词,无论是同一个单词还是一个新词

编辑:通过创建两个新的全局变量来解决,这些变量保存单词的旧位置和长度的值,然后在找到新单词之前将突出显示重新着色为黑色/白色

  • 如果搜索新词,则从0(数据顶部)开始位置

编辑:通过重置findTxt def内的startPos值来解决

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

相关内容

  • 没有找到相关文章

最新更新