Wxpython 更改网格数据时更改网格大小

Wxpython 更改网格数据时更改网格大小,wxpython,wxgrid,Wxpython,Wxgrid,在最初用Python创建wx网格之后,我很难更新它。 我将按照此处的步骤进行操作: 但由于某些原因,网格没有正确显示。无论数据是增长还是收缩,行都会不断添加 这是代码。单击“刷新”按钮可重新初始化网格应显示的数据。这个bug(我想)在函数refreshGrid中,但我不知道是什么导致了它 import wx from wxPython.wx import * from wxPython.grid import * import wx.grid import wx.grid as gridlib

在最初用Python创建wx网格之后,我很难更新它。 我将按照此处的步骤进行操作: 但由于某些原因,网格没有正确显示。无论数据是增长还是收缩,行都会不断添加

这是代码。单击“刷新”按钮可重新初始化网格应显示的数据。这个bug(我想)在函数refreshGrid中,但我不知道是什么导致了它

import wx
from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx.grid as gridlib
from wx.grid import Grid
import os
import sys

class MyForm(wx.Frame):

    def __init__(self):
        self.refreshMyData()

        #- Initialize the window:
        wx.Frame.__init__(self, None, wx.ID_ANY, "Grid with Popup Menu", size=(1100,300))

        # Add a panel so it looks correct on all platforms
        self.panel = wx.Panel(self, wx.ID_ANY)

        num_of_columns = 3
        self.grid = gridlib.Grid(self.panel)
        self.grid.CreateGrid(len(self.myDataList), num_of_columns)

        # change a couple column labels
        self.grid.SetColLabelValue(0, "Name")
        self.grid.SetColLabelValue(1, "Tag")
        self.grid.SetColLabelValue(2, "ID")

        self.refreshGrid()

        toolbar = self.CreateToolBar()

        qtool = toolbar.AddLabelTool(wx.ID_ANY, 'Refresh', wx.Bitmap(os.path.join(os.path.dirname(__file__), 'refresh.png')))
        toolbar.AddSeparator()
        self.Bind(wx.EVT_TOOL, self.refreshButton, qtool)

        toolbar.Realize()
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.grid, 1, wx.EXPAND, num_of_columns)
        self.panel.SetSizer(sizer)

    def refreshMyData(self):
        print '------------refreshing my data'
        import random
        self.myDataList = []
        for i in range(random.randrange(10)):
            self.myDataList.append({'Name':str(i), 'Tag':str(i), 'ID':str(i)})

    def refreshButton(self, event):
        self.refreshMyData()
        self.refreshGrid()

    def refreshGrid(self):
        print '\n\n\n------------refresh grid'
        #- Clear the grid:
        self.grid.ClearGrid()
        print 'Number of current rows: ' + str(self.grid.GetNumberRows())
        print 'Size of myDataList: ', len(self.myDataList)
        self.grid.BeginBatch()
        current, new, delmsg, addmsg = (len(self.myDataList), self.grid.GetNumberRows(), wxGRIDTABLE_NOTIFY_ROWS_DELETED, wxGRIDTABLE_NOTIFY_ROWS_APPENDED)
        if new < current:
                print 'deleting rows:', current-new
                msg = wx.grid.GridTableMessage(
                        self.grid.GetTable(),
                        delmsg,
                        new,    # position
                        current-new,
                )
                self.grid.ProcessTableMessage(msg)
        elif new > current:
                print 'adding rows: ', new-current
                msg = wx.grid.GridTableMessage(
                        self.grid.GetTable(),
                        addmsg,
                        new-current
                )
                self.grid.ProcessTableMessage(msg)

        msg = wx.grid.GridTableMessage(self.grid.GetTable(), wxGRIDTABLE_REQUEST_VIEW_GET_VALUES)
        self.grid.ProcessTableMessage(msg)
        self.grid.EndBatch()

        print 'Number of current rows after data refresh and grid update: ' + str(self.grid.GetNumberRows())

        #- Populate the grid with new data:
        for i in range(len(self.myDataList)):
            self.grid.SetCellValue(i, 0, self.myDataList[i]['Name'])
            self.grid.SetCellValue(i, 1, self.myDataList[i]['Tag'])
            self.grid.SetCellValue(i, 2, self.myDataList[i]['ID'])

# Run the program
if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = MyForm().Show()
    app.MainLoop()
导入wx
从wxPython.wx导入*
从wxPython.grid导入*
导入wx.grid
将wx.grid作为gridlib导入
从wx.grid导入网格
导入操作系统
导入系统
类MyForm(wx.Frame):
定义初始化(自):
self.refreshMyData()
#-初始化窗口:
Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
#添加一个面板,使其在所有平台上看起来都正确
self.panel=wx.panel(self,wx.ID\u ANY)
_列的数量=3
self.grid=gridlib.grid(self.panel)
self.grid.CreateGrid(len(self.myDataList),num_of_列)
#更改两个列标签
self.grid.SetColLabelValue(0,“名称”)
self.grid.SetColLabelValue(1,“标记”)
self.grid.SetColLabelValue(2,“ID”)
self.refreshGrid()
toolbar=self.CreateToolBar()
qtool=toolbar.AddLabelTool(wx.ID_ANY,'Refresh',wx.Bitmap(os.path.join(os.path.dirname(uu file,'Refresh.png'))
toolbar.AddSeparator()
self.Bind(wx.EVT_工具、self.refreshButton、qtool)
toolbar.Realize()
sizer=wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.grid,1,wx.EXPAND,num_of_列)
自我面板设置器(施胶器)
def refreshMyData(自我):
打印'--------------刷新我的数据'
随机输入
self.myDataList=[]
对于范围内的i(random.randrange(10)):
self.myDataList.append({'Name':str(i),'Tag':str(i),'ID':str(i)})
def刷新按钮(自身、事件):
self.refreshMyData()
self.refreshGrid()
def刷新网格(自):
打印'\n\n\n--------------刷新网格'
#-清除网格:
self.grid.ClearGrid()
打印“当前行数:”+str(self.grid.GetNumberRows())
打印“myDataList的大小:”,len(self.myDataList)
self.grid.BeginBatch()文件
当前、新、delmsg、addmsg=(len(self.myDataList)、self.grid.GetNumberRows()、wxGRIDTABLE\u NOTIFY\u ROWS\u DELETED、wxGRIDTABLE\u NOTIFY\u ROWS\u added)
如果新的<当前的:
打印“删除行:”,当前新建
msg=wx.grid.GridTableMessage(
self.grid.GetTable(),
delmsg,
新的#位置
当前新,
)
self.grid.ProcessTableMessage(msg)
elif新建>当前:
打印“添加行:”,新的当前行
msg=wx.grid.GridTableMessage(
self.grid.GetTable(),
addmsg,
新流
)
self.grid.ProcessTableMessage(msg)
msg=wx.grid.GridTableMessage(self.grid.GetTable(),wxGRIDTABLE\u REQUEST\u VIEW\u GET\u value)
self.grid.ProcessTableMessage(msg)
self.grid.EndBatch()
打印“数据刷新和网格更新后的当前行数:”+str(self.grid.GetNumberRows())
#-用新数据填充网格:
对于范围内的i(len(self.myDataList)):
self.grid.SetCellValue(i,0,self.myDataList[i]['Name'])
self.grid.SetCellValue(i,1,self.myDataList[i]['Tag']))
self.grid.SetCellValue(i,2,self.myDataList[i]['ID']))
#运行程序
如果名称=“\uuuuu main\uuuuuuuu”:
app=wx.PySimpleApp()
frame=MyForm().Show()
app.MainLoop()

当。我想出来了。以下是解决方案:

def refreshGrid(self):
    print '\n\n\n------------refresh grid'
    #- Clear the grid:
    self.grid.ClearGrid()
    print 'Number of current rows: ' + str(self.grid.GetNumberRows())
    print 'Size of myDataList: ', len(self.myDataList)

    current, new = (self.grid.GetNumberRows(), len(self.myDataList))

    if new < current:
        #- Delete rows:
        self.grid.DeleteRows(0, current-new, True)

    if new > current:
        #- append rows:
        self.grid.AppendRows(new-current)


    #- Populate the grid with new data:
    print 'Num of rows has been modified to:', self.grid.GetSize()
    for i in range(len(self.myDataList)):
        self.grid.SetCellValue(i, 0, self.myDataList[i]['Name'])
        self.grid.SetCellValue(i, 1, self.myDataList[i]['Tag'])
        self.grid.SetCellValue(i, 2, self.myDataList[i]['ID'])
def刷新网格(自):
打印'\n\n\n--------------刷新网格'
#-清除网格:
self.grid.ClearGrid()
打印“当前行数:”+str(self.grid.GetNumberRows())
打印“myDataList的大小:”,len(self.myDataList)
当前,新=(self.grid.GetNumberRows(),len(self.myDataList))
如果新的<当前的:
#-删除行:
self.grid.DeleteRows(0,当前新建,True)
如果新建>当前:
#-追加行:
self.grid.AppendRows(新当前)
#-用新数据填充网格:
打印“行数已修改为:”,self.grid.GetSize()
对于范围内的i(len(self.myDataList)):
self.grid.SetCellValue(i,0,self.myDataList[i]['Name'])
self.grid.SetCellValue(i,1,self.myDataList[i]['Tag']))
self.grid.SetCellValue(i,2,self.myDataList[i]['ID']))

干得好!我很惊讶没有一个更简单的方法来实现内置的。