You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WxPython Grid AppendRows问题:添加行后最后一行数据丢失

解决wxPython表格添加行后最后一行数据丢失的问题

嘿,我来帮你搞定这个问题!你遇到的情况很常见——当手动往_data里添加新行后,表格控件根本不知道数据已经更新了,所以才会出现最后一行数据“丢失”的情况。另外你的代码里GetValue方法没写完,这也会导致数据无法正确渲染。

下面是修复后的完整代码,我会标注关键的修复点:

import wx
import wx.grid

class GridData(wx.grid.PyGridTableBase):
    _cols = "a b c".split()
    _data = [
        "1 2 3".split(),
        "4 5 6".split(),
        "7 8 9".split()
    ]
    _highlighted = set()

    def GetColLabelValue(self, col):
        return self._cols[col]

    def GetNumberRows(self):
        return len(self._data)

    def GetNumberCols(self):
        return len(self._cols)

    def GetValue(self, row, col):
        # 完善GetValue方法,确保能正确返回对应单元格的数据
        return self._data[row][col]

    def SetValue(self, row, col, value):
        # 可选但推荐:支持单元格编辑,将用户输入同步到数据源
        self._data[row][col] = value

    def AddRow(self):
        # 添加新行的核心方法:更新数据源+通知表格刷新
        self._data.append(["", "", ""])  # 可以自定义新行的初始值
        # 发送表格行数增加的通知,让控件感知到数据变化
        msg = wx.grid.GridTableMessage(self, wx.grid.GRIDTABLE_NOTIFY_ROWS_APPENDED, 1)
        if self.GetView():
            self.GetView().ProcessTableMessage(msg)

class MyFrame(wx.Frame):
    def __init__(self, parent, title):
        super(MyFrame, self).__init__(parent, title=title, size=(400, 300))
        panel = wx.Panel(self)
        vbox = wx.BoxSizer(wx.VERTICAL)

        # 初始化表格并绑定数据源
        self.grid = wx.grid.Grid(panel)
        self.table = GridData()
        self.grid.SetTable(self.table)

        # 添加添加行的按钮
        add_btn = wx.Button(panel, label="添加新行")
        add_btn.Bind(wx.EVT_BUTTON, self.on_add_row)

        vbox.Add(self.grid, 1, wx.EXPAND | wx.ALL, 5)
        vbox.Add(add_btn, 0, wx.CENTER | wx.BOTTOM, 5)
        panel.SetSizer(vbox)

    def on_add_row(self, event):
        self.table.AddRow()

if __name__ == "__main__":
    app = wx.App()
    frame = MyFrame(None, "可添加行的表格")
    frame.Show()
    app.MainLoop()

关键修复说明:

  • 完善GetValue方法:这是表格获取数据的核心入口,必须正确返回数据源中对应行列的内容,否则单元格会显示为空。
  • 新增AddRow方法:除了更新_data列表,最重要的是通过GridTableMessage向表格控件发送“行数增加”的通知,让控件主动刷新并显示新行。
  • 补充SetValue方法:如果需要支持单元格编辑,这个方法能把用户输入的内容同步回数据源,避免编辑后数据丢失。

测试一下这个代码,点击“添加新行”按钮,新行会正常显示,再也不会出现最后一行数据丢失的问题啦!

内容的提问来源于stack exchange,提问作者David

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:10:38