Диалог поиска текста с помощью wxpython

У кого-нибудь есть очень простой пример использования диалога поиска с текстовым компонентом в wxpython?

Заранее спасибо.


person usertest    schedule 30.09.2010    source источник


Ответы (2)


Использование wx.FindReplaceDialog не так просто, как можно было бы ожидать от его имени. Этот диалог предоставляет вам виджет диалога с параметрами и записями для действия поиска (или замены). Вы можете прочитать эти параметры и строку для поиска из диалога (фактически из события или из объекта wx.FindReplaceData). Однако чтение, поиск и/или замена в целевом тексте и процесс визуализации попадания должны быть реализованы отдельно.

Это, например, рисунок, показывающий диалоговое окно со строкой, которую нужно найти, и текстовый элемент управления, где найденная строка выделена цветом.enter

Рисунок был создан с кодом ниже. Обратите внимание, однако, что этот код не полностью функционален. Так как это работает только для первого поиска. Для следующего поиска вы должны выполнить новый 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, а также для события, которые они генерируют.

Кроме того, вы можете проверить код редактора python stani. Графический интерфейс — это wxPython с плагином для поиска файлов, содержащих заданный текст, на разной глубине дерева каталогов. Там можно получить хорошую подсказку. Однако это не wx.Dialog, как вы хотите.

person joaquin    schedule 30.09.2010

Используйте вики.

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()
person razpeitia    schedule 30.09.2010