WxPython,如何实现wx.grid.Grid的分页功能?

问题描述 投票:0回答:1

我想加载一个 csv 文件(10 列,1 000 000 行)到 wx.Grid 并自动调整行大小。 自动调整 100 万行大小所需的时间太多(>1 小时,具体取决于数据)。

所以我想给wx.Grid实现分页功能。

我的想法:

1:使用wx.grid垂直滚动条

  1. 最初使用自动调整大小加载 1000 行数据。
  2. 要在到达网格末尾时捕获 wx.grid 垂直滚动条事件,请向网格追加另外 1000 行。

2:使用菜单选项或按钮

  1. 在父 Wx.Frame 中创建菜单选项或按钮,名称为 Prev、Next,保持禁用状态。
  2. 然后在 Wx.Frame 上加载 wx.grid,只有 1000 行数据并自动调整大小,并启用 Prev、Next 选项。
  3. 每当用户按下任何选项时,清除网格上的数据,并添加接下来的 1000 行数据。

1 的代码: 创建了没有数据的空样本网格。 尝试使用滚动条滚动底部事件来触发 AddRows 函数: (但它不适用于任何滚动条事件,我尝试过)

import wx
import wx.grid

class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="A Simple Grid")

        panel = wx.Panel(self)
        myGrid = MyGrid(panel)
        myGrid.fillGrid()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(myGrid, 1, wx.EXPAND)
        panel.SetSizerAndFit(sizer)

        self.Maximize()


class MyGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent)

    def fillGrid(self):
        self.CreateGrid(1000, 10)

        self.SetColLabelValue(0, "Column1")
        self.SetColLabelValue(1, "Column2")
        self.SetColLabelValue(2, "Column3")
        self.SetColLabelValue(3, "Column4")
        self.SetColLabelValue(4, "Column5")
        self.SetColLabelValue(5, "Column6")
        self.SetColLabelValue(6, "Column7")
        self.SetColLabelValue(7, "Column8")
        self.SetColLabelValue(8, "Column9")
        self.SetColLabelValue(9, "Column10")

        self.SetDefaultColSize(width=350, resizeExistingCols=True)
        self.SetDefaultRowSize(height=30, resizeExistingRows=True)
        
        # Any proper Scroll Bar Event to Trigger Add new rows.
        self.Bind(wx.EVT_SCROLL_BOTTOM, self.AddRows)

    def AddRows(self, event):
        self.AppendRows(1000, True)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()

总结

以我有限的 WxPython 经验,我无法正确实现上述任何想法。

我需要一个有效的实现来实现上述 wx.grid 分页的想法。

请提出其他可能的想法来实现我对分页功能的需求。

版本:

  • Windows V20H2
  • Python 3.10.7
  • WxPython 4.2.0
python pagination grid wxpython wxgrid
1个回答
0
投票

为wx.Grid实现分页功能。 使用菜单选项(页)

  1. 在父 Wx.Frame 中创建菜单选项,名称为“Page”,子菜单“Next”。
  2. 在Wx.Frame上初始化了wx.grid,只有25000行数据,默认列大小。
  3. 每当用户按下“下一个菜单”按钮时,代码就会追加接下来的 10000 行空数据。

第二个想法的代码:

# This python code is to load grid using paging functionality via Menu Option
# New Menu Option Page is created with SubMenu "Next (Ctrl + N)"
# Initially when triggering Grid, Loads only 25000 rows
# When clicked on next button in Page Menu, it loads another 10000 rows
import wx
import wx.grid


class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="Grid Paging via Menu Option")

        menubar = wx.MenuBar()
        page_menu = wx.Menu()
        menubar.Append(page_menu, "Page")
        next_item = wx.MenuItem(page_menu, wx.ID_EXIT, '&Next\tCtrl+N')
        page_menu.Append(next_item)
        self.Bind(wx.EVT_MENU, self.loadNextCells, next_item)

        panel = wx.Panel(self)
        self.myGrid = MyGrid(panel)
        self.myGrid.fillGrid()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.myGrid, 1, wx.EXPAND)
        panel.SetSizerAndFit(sizer)

        self.SetMenuBar(menubar)
        self.Maximize()

    def loadNextCells(self, e):
        MyGrid.AddRows(self.myGrid)


class MyGrid(wx.grid.Grid):
    def __init__(self, parent):
        wx.grid.Grid.__init__(self, parent, style=wx.HSCROLL | wx.VSCROLL)
        self.rowCount = None

    def fillGrid(self):
        self.CreateGrid(25000, 7)
        self.SetDefaultColSize(width=350, resizeExistingCols=True)
        self.SetSelectionMode(selmode=self.GridSelectRows)

    def AddRows(self):
        self.AppendRows(10000, True)


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyForm().Show()
    app.MainLoop()
© www.soinside.com 2019 - 2024. All rights reserved.