当垂直进度条滚动到网格末尾时,如何向 wxpython 网格添加新行

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

在程序启动时,我想加载 5 列和 1000 行的 Wx.Grid。 并且,当 wx.grid 的垂直滚动条滚动到网格末尾时,我想再次追加 1000 行。

所以,我试图在到达网格末尾时捕获 wx.grid 垂直滚动条事件,并调用追加行函数。

但是,没有一个滚动条事件对我有用。!

我使用的版本:

  • Windows V20H2
  • Python 3.10.8
  • WxPython 4.2.0

问题代码: 对于具有 5 列和 1000 行的空网格,当滚动条到达网格末尾时,我尝试添加 1000 个空行。

import wx
import wx.grid


class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="To Append Rows")

        panel = wx.Panel(self)

        global myGrid
        myGrid = wx.grid.Grid(panel)
        myGrid.CreateGrid(1000, 5)

        myGrid.SetColLabelValue(0, "Column1")
        myGrid.SetColLabelValue(1, "Column2")
        myGrid.SetColLabelValue(2, "Column3")
        myGrid.SetColLabelValue(3, "Column4")
        myGrid.SetColLabelValue(4, "Column5")

        myGrid.SetDefaultColSize(width=500, resizeExistingCols=True)
        myGrid.SetDefaultRowSize(height=30, resizeExistingRows=True)

        # None the below events work to catch a scroll bar event and trigger append rows.
        myGrid.Bind(wx.EVT_SCROLL_BOTTOM, self.AddRows)
        myGrid.Bind(wx.EVT_SCROLL_ENDSCROLL, self.AddRows)
        myGrid.Bind(wx.EVT_SCROLL, self.AddRows)
        myGrid.Bind(wx.EVT_SCROLLBAR, self.AddRows)
        myGrid.Bind(wx.EVT_SCROLL_PAGEDOWN, self.AddRows)
        myGrid.Bind(wx.EVT_SCROLLWIN_BOTTOM, self.AddRows)

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

        self.Maximize()

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


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

python pagination grid wxpython wxgrid
1个回答
1
投票

仅使用

wx.grid.Grid
而不使用
wx.grid.GridTableBase
,您需要手动跟踪表中有多少行(我认为)。

您当前正在使用 wx.EVT_SCROLL 事件,这些事件用于独立滚动条。您应该使用

wx.ScrollWinEvent

以下内容应该会让您更接近目标。我还跟踪了 Down 和 Page Down 键,以防键盘输入并在开始时手动设置最后一行。

此处,设置为第 99 行,随后为第 199 行、第 299 行等

import wx
import wx.grid


class MyForm(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="To Append Rows")

        panel = wx.Panel(self)

        self.myGrid = wx.grid.Grid(panel)
        self.myGrid.CreateGrid(100, 5)
        self.lastrow = 98
        self.myGrid.SetColLabelValue(0, "Column1")
        self.myGrid.SetColLabelValue(1, "Column2")
        self.myGrid.SetColLabelValue(2, "Column3")
        self.myGrid.SetColLabelValue(3, "Column4")
        self.myGrid.SetColLabelValue(4, "Column5")

        self.myGrid.SetDefaultColSize(width=100, resizeExistingCols=True)
        self.myGrid.SetDefaultRowSize(height=30, resizeExistingRows=True)

        self.myGrid.Bind(wx.EVT_SCROLLWIN, self.AddRows)
        self.myGrid.Bind(wx.EVT_KEY_DOWN, self.OnKey)

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

        #self.Maximize()

    def AddRows(self, event):
        if self.myGrid.IsVisible(self.lastrow, 0):
            self.myGrid.AppendRows(100, True)
            self.lastrow += 100
            self.Refresh()
            print("Rows Added")
        if event:
            event.Skip()

    def OnKey(self, event):
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_DOWN or keycode == wx.WXK_PAGEDOWN:
            self.AddRows(None)
        event.Skip()

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

希望在愤怒中使用

wx.grid
的人能够发布更好的答案。

© www.soinside.com 2019 - 2024. All rights reserved.