天天看點

wxPython - 查找替換對話框FindReplaceDialog

作者:愛好史地的coder

實戰wxPython系列-025

wxPython - 查找替換對話框FindReplaceDialog

在進行文本處理的GUI程式中,常常需要對文本中的一些文字進行查找和(或)替換操作,在這種情況下,就需要一個具有查找替換功能的對話框來互動完成需要的功能,在wxPython提供的類wx.FindReplaceDialog可以快速友善地實作這個功能。

一、wx. FindReplaceDialog

wx.FindReplaceDialog是一個标準的無模式對話框,用于允許使用者搜尋某些文本(并可能将其替換為其他文本)。

實際的搜尋應該在所wx.FindReplaceDialog的父視窗中完成。注意,這意味着與其他标準對話框不同,這個對話框必須有一個父視窗。還要注意,沒有辦法以模式對話框的方式使用這個對話框;在設計和實作上,它總是無模式的。

wx.FindReplaceDialog構造函數原型:

wx.FindReplaceDialog(parent, data, title, style)

參數:

parent:父視窗

data:儲存wx.FindReplaceDialog的資料,該資料類型為wx.FindReplaceData。

title:對話框标題欄。

style:對話框的樣式。

wx.FindReplaceDialog常用方法:

  • GetData(self):得到對話框使用的wx.FindReplaceData對象。
wxPython - 查找替換對話框FindReplaceDialog

圖1:wx.FindReplaceDialog類繼承關系

二、wx.FindReplaceData

wx.FindReplaceData儲存wx.FindReplaceDialog的資料。它作為預設值初始化wx.FindReplaceDialog的初始值,在最關閉對話框時儲存對話框最新的資料。對話框每次都會更新wx.FindDialogEvent事件,是以,我們可以使用wx.FindDialogEvent事件綁定的方法來值得查詢 wx.FindReplaceData對象。

  • GetFindString(self):獲得要查找的字元串。
  • GetFlags(self):擷取FindReplaceFlags值的組合。
  • GetReplaceString(self):獲得要替換的字元串。
  • SetFindString(self, str):設定要查找的字元串(對話框将其用作初始值)。
  • SetFlags(self, flags):設定用于初始化對話框控件的标志。
  • SetReplaceString(self, str):設定替換字元串(作為對話框的初始值)。

三、wx.FindReplaceDialog示範

下面的代碼示範了如何使用wx.FindReplaceDialog。

#查找替換對話框(wx.FindReplaceDialog)

import wx

class SampleFindReplaceDialog(wx.Frame):

    def __init__(self, *args, **kw):
        super(SampleFindReplaceDialog, self).__init__(*args, **kw)

        self.InitUi()

    def InitUi(self):
        #設定标題
        self.SetTitle("實戰wxPython: FindReplaceDialog示範")
        #設定視窗尺寸
        self.SetSize(480, 360)

        info = '''
        We’ve trained a model called ChatGPT which interacts in a 
        conversational way. The dialogue format makes it possible 
        for ChatGPT to answer followup questions, admit its 
        mistakes, challenge incorrect premises, and reject 
        inappropriate requests. ChatGPT is a sibling model to 
        InstructGPT, which is trained to follow an instruction 
        in a prompt and provide a detailed response.
        '''

        #建立文本編輯框
        self.tc = wx.TextCtrl(self, wx.ID_ANY, info, style=wx.TE_MULTILINE|wx.TE_RICH2)
        self.btnFind = wx.Button(self, wx.ID_ANY, "查找")
        
        self.Bind(wx.EVT_BUTTON, self.OnButton, self.btnFind)
        self.Bind(wx.EVT_FIND, self.OnFind)
        self.Bind(wx.EVT_FIND_NEXT, self.OnFind)

        self.pos = 0
        self.size = 0

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.tc, 1, wx.EXPAND, 0)
        sizer.Add(self.btnFind, 0, wx.ALIGN_CENTER_HORIZONTAL, 0)

        self.SetSizer(sizer)
        #sizer.Fit(self)
        #self.Layout()

        self.Centre()

    def OnButton(self, e):
        self.txt = self.tc.GetValue()
        #初始化并儲存搜尋參數
        self.data = wx.FindReplaceData()
        #建立查找對話框并顯示
        self.dlg = wx.FindReplaceDialog(self.tc, self.data, "查找")
        self.dlg.Show()

    def OnFind(self, e):
        #要查找的字元串
        fString = self.data.GetFindString()
        #字元串長度
        self.size = len(fString)
        #查找到的位置
        self.pos = self.txt.find(fString, self.pos)
        #将查找到的字元串設定為黑底紅字
        self.tc.SetStyle(self.pos, self.pos + self.size, wx.TextAttr("red", "black"))
        #下次開始查找的位置
        self.pos += self.size

def main():
    app = wx.App()
    sample = SampleFindReplaceDialog(None)
    sample.Show()
    app.MainLoop()

if __name__ == "__main__":
    main()           

在上述代碼中,我們建立了一個wx.TextCtrl文本編輯對話框,并添加了一些文字内容,在點選”查找下一個”按鈕後,已該文本編輯對話框為父視窗,建立一個wx.FindReplaceDialog對話框來來執行查找, 當查找内容不為空時,點查找,将發出wx.EVT_FIND事件,之後查找将發出wx.EVT_FIND_NEXT事件,這兩個事件都由OnFind方法來處理。

運作上述代碼,點選”查找”按鈕, 彈出查找對話框,在文本框中輸入”ChatGPT”并按Enter鍵,這時”查找下一個”按鈕将激活,點選該按鈕,就可以進行查找工作,每查找到一個”ChatGPT”字元串,就将其設定為黑白紅字樣式。運作結果如圖2所示。

wxPython - 查找替換對話框FindReplaceDialog

圖2:wx.FindReplaceDialog示範

四、本文知識點

  • 了解wx .FindReplaceDialog。
  • 使用wx .FindReplaceDialog進行文本查找。

前一篇:wxPython-列印對話框和頁面設定對話框(列印輸出)

請關注,評論,收藏,點贊,和轉發。