【问题标题】:WxPython, How to implement paging functionality for wx.grid.Grid?WxPython,如何实现wx.grid.Grid的分页功能?
【发布时间】:2023-02-21 13:38:51
【问题描述】:

我想将带有(10 列,1 000 000 行)的 csv 文件加载到具有行自动调整大小的 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
      • 蟒蛇 3.10.7
      • WxPython 4.2.0

【问题讨论】:

    标签: python grid wxpython paging wxgrid


    【解决方案1】:

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

    1. 在父 Wx.Frame 中创建了名称为“的菜单选项", 子菜单 "下一个”。
    2. 在 Wx.Frame 上初始化了 wx.grid,只有 25000 行数据和默认的列大小。
    3. 每当用户按下 Next Menu 按钮时,代码都会附加接下来的 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	Ctrl+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()
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-25
      • 2020-07-31
      • 1970-01-01
      • 1970-01-01
      • 2014-03-16
      • 2021-04-07
      • 2022-10-13
      • 2012-11-29
      相关资源
      最近更新 更多