我有一个包含各种日志数据的TextCtrl,我还有一个EditText字段,用户可以搜索要查找的字符串,然后单击“查找”按钮找到并突出显示日志中的单词。您的标准在浏览器/记事本等中查找/突出显示。
我所拥有的代码已经可以工作并成功突出显示用户的话,但是我想要实现的内容有几个缺失:
如果搜索新单词 EDIT:,则通过重置{{1}内的startPos值来开始位置0(数据顶部) } def
findTxt
答案 0 :(得分:0)
符合所有标准: 下面是wx搜索和突出显示功能的新完整代码。它不是很漂亮,但它确实有用。
编辑:通过添加'查找下一个'按钮,下面的代码。计数将下一个突出显示限制为1个字,而不是全部限制在数据末尾。
编辑:通过创建2个新的全局变量来解决,这些变量保存旧位置和单词长度的值,然后在找到新单词之前将高亮重新着色为黑/白
编辑:通过重置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