У кого-нибудь есть очень простой пример использования диалога поиска с текстовым компонентом в wxpython?
Заранее спасибо.
У кого-нибудь есть очень простой пример использования диалога поиска с текстовым компонентом в wxpython?
Заранее спасибо.
Использование 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
a>, wx.FindReplaceData
, а также для события, которые они генерируют.
Кроме того, вы можете проверить код редактора python stani. Графический интерфейс — это wxPython с плагином для поиска файлов, содержащих заданный текст, на разной глубине дерева каталогов. Там можно получить хорошую подсказку. Однако это не wx.Dialog
, как вы хотите.
Используйте вики.
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()