使用wxpython查找文本对话框

1 投票
2 回答
1852 浏览
提问于 2025-04-16 04:47

有没有人能给我一个很简单的例子,教我怎么在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 对象来获取)。不过,读取、搜索和替换目标文本的过程,以及如何显示找到的内容,需要你自己单独实现。

比如,下面这张图展示了一个对话框,里面有要查找的字符串,还有一个文本框,找到的字符串会被标记成不同的颜色。enter image description here

这张图是通过下面的代码生成的。不过要注意,这段代码并不是完全可用的。现在它只能处理第一次搜索。要进行下一次搜索,你需要从当前的位置重新调用 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.FindReplaceDialogwx.FindReplaceData 的属性和方法,还有它们发出的 事件

另外,你也可以看看 stani的Python编辑器的代码。这个图形界面是用wxPython做的,并且有一个插件可以查找包含特定文本的文件,搜索的深度可以在目录树中调整。你可以从中获得一些不错的提示。不过,它并不是你想要的 wx.Dialog

撰写回答