使用wxpython查找文本对话框
有没有人能给我一个很简单的例子,教我怎么在wxpython中用查找对话框和文本组件?
提前谢谢大家。
2 个回答
-2
使用这个维基页面来获取更多信息。
import wx
class MyDialog(wx.Dialog):
def __init__(self, parent, id, title):
wx.Dialog.__init__(self, parent, id, title)
class MyApp(wx.App):
def OnInit(self):
dia = MyDialog(None, -1, "simpledialog.py")
dia.ShowModal()
dia.Destroy()
return True
app = MyApp(0)
app.MainLoop()
3
使用 wx.FindReplaceDialog
这个对话框并不像它的名字听起来那么简单。这个对话框提供了一个可以输入搜索(或替换)内容的窗口,你可以从这个窗口读取参数和要查找的字符串(实际上是通过事件或者 wx.FindReplaceData
对象来获取)。不过,读取、搜索和替换目标文本的过程,以及如何显示找到的内容,需要你自己单独实现。
比如,下面这张图展示了一个对话框,里面有要查找的字符串,还有一个文本框,找到的字符串会被标记成不同的颜色。
这张图是通过下面的代码生成的。不过要注意,这段代码并不是完全可用的。现在它只能处理第一次搜索。要进行下一次搜索,你需要从当前的位置重新调用 string.find()
,而且你可能还想把之前找到的字符串“清理”掉,让它恢复成原来的样式。此外,这段脚本没有使用其他参数(比如搜索方向、是否区分大小写等)。
import wx
class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds["style"] = wx.DEFAULT_FRAME_STYLE
wx.Frame.__init__(self, *args, **kwds)
self.tc = wx.TextCtrl(self, -1, "", style=wx.TE_MULTILINE|wx.TE_RICH2)
self.bt_find = wx.Button(self, -1, "find")
self.Bind(wx.EVT_BUTTON, self.on_button, self.bt_find)
self.Bind(wx.EVT_FIND, self.on_find)
self.pos = 0
self.size = 0
#
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.tc, 1, wx.EXPAND, 0)
sizer.Add(self.bt_find, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)
self.SetSizer(sizer)
sizer.Fit(self)
self.Layout()
def on_button(self, event):
self.txt = self.tc.GetValue()
self.data = wx.FindReplaceData() # initializes and holds search parameters
self.dlg = wx.FindReplaceDialog(self.tc, self.data, 'Find')
self.dlg.Show()
def on_find(self, event):
fstring = self.data.GetFindString() # also from event.GetFindString()
self.pos = self.txt.find(fstring, self.pos)
self.size = len(fstring)
self.tc.SetStyle(self.pos, self.pos+self.size, wx.TextAttr("red", "black"))
if __name__ == "__main__":
app = wx.PySimpleApp(0)
frame_1 = MyFrame(None, wx.ID_ANY, "")
frame_1.Show()
app.MainLoop()
如果想充分利用这个对话框,你可以查看 wx.FindReplaceDialog
和 wx.FindReplaceData
的属性和方法,还有它们发出的 事件。
另外,你也可以看看 stani的Python编辑器的代码。这个图形界面是用wxPython做的,并且有一个插件可以查找包含特定文本的文件,搜索的深度可以在目录树中调整。你可以从中获得一些不错的提示。不过,它并不是你想要的 wx.Dialog
。