首页 > 解决方案 > 在 wxPython 中搜索所有出现的字符串的网格

问题描述

我想搜索一个网格并找到所有包含与 Excel 的查找功能(CTRL + F)非常相似的字符串的单元格。然后使用 Next 和 Previous 按钮导航到这些单元格。我知道我可以使用循环来构建列表,但我的一些表有 60,000 多条记录,我试图避免过多的滞后时间。我的替代方法是搜索填充我的网格的数据框。

有没有人已经为此构建了一个功能?我觉得这将是一项常见的任务,但没有太多可用的。我正在寻找所有出现的不区分大小写的部分匹配。

import wx.grid

class SimpleGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, -1)
        self.CreateGrid(9, 2)
        self.SetColLabelValue(0, "First")
        self.SetColLabelValue(1, "Last")
        self.SetRowLabelValue(0, "1")
        self.SetCellValue(0, 0, "AA")
        self.SetCellValue(0, 1, "A")
        self.SetRowLabelValue(1, "2")
        self.SetCellValue(1, 0, "BA")
        self.SetCellValue(1, 1, "B")
        self.SetRowLabelValue(2, "3")
        self.SetCellValue(2, 0, "C")
        self.SetCellValue(2, 1, "C")
        self.SetRowLabelValue(3, "4")
        self.SetCellValue(3, 0, "D")
        self.SetCellValue(3, 1, "D")
        self.SetRowLabelValue(4, "5")
        self.SetCellValue(4, 0, "E")
        self.SetCellValue(4, 1, "E")
        self.SetRowLabelValue(5, "6")
        self.SetCellValue(5, 0, "F")
        self.SetCellValue(5, 1, "F")
        self.SetRowLabelValue(6, "7")
        self.SetCellValue(6, 0, "G")
        self.SetCellValue(6, 1, "G")
        self.SetRowLabelValue(7, "8")
        self.SetCellValue(7, 0, "K")
        self.SetCellValue(7, 1, "K")
        self.SetRowLabelValue(8, "9")
        self.SetCellValue(8, 0, "L")
        self.SetCellValue(8, 1, "L")
    def on_key(self, event):
        if event.ControlDown() and event.GetKeyCode() == 70: #CTRL + F
            self.searchValue(event)

        else:
            event.Skip()
            print('error')

    def searchValue(self, event):
        print("search entire grid")

class TestFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent, -1, "A Grid",
                size=(400, 400))
        self.p = wx.Panel(self)

        self.grid = SimpleGrid(self)
        self.searchbox =wx.TextCtrl(self.p)
        self.btn = wx.Button(self.p, label = "OK")
        self.btn_previous = wx.Button(self.p, label = "Previous")
        self.btn_next = wx.Button(self.p, label = "Next")
        self.btn.Bind(wx.EVT_BUTTON, self.searchValue)
        self.btn_previous.Bind(wx.EVT_BUTTON, self.previousValue)
        self.btn_next.Bind(wx.EVT_BUTTON, self.nextValue)
        self.sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.btn_previous,proportion = 1,flag = wx.ALL|wx.EXPAND,border = 5)
        self.sizer.Add(self.btn_next,proportion = 1,flag = wx.ALL|wx.EXPAND,border = 5)

        self.mainsizer = wx.BoxSizer(wx.VERTICAL)
        self.mainsizer.Add(self.grid,proportion = 0, flag = wx.ALL|wx.EXPAND,border = 5)
        self.mainsizer.Add(self.searchbox,proportion = 1,flag = wx.ALL|wx.EXPAND,border = 5)
        self.mainsizer.Add(self.btn,proportion = 1,flag = wx.ALL|wx.EXPAND,border = 5)
        self.mainsizer.Add(self.sizer,proportion = 1,flag = wx.ALL|wx.EXPAND,border = 5)
        
        self.p.SetSizerAndFit(self.mainsizer)

    def searchValue(self, event):
        print("Get row, col location of all occurences for: " + str(self.searchbox.GetValue()))

    def nextValue(self,event):
        print("NEXT")

    def previousValue(self,event):
        print("PREVIOUS")
   

app = wx.App()
frame = TestFrame(None)
frame.Show(True)
app.MainLoop()

标签: pythondatagridwxpython

解决方案


推荐阅读