wxPython更新网格单元背景颜色

wxPython更新网格单元背景颜色,python,wxpython,wxwidgets,Python,Wxpython,Wxwidgets,我正在用wxPython编写一个小程序,它显示一个有限大小的浮点数网格,该网格以numpy数组的形式并行存储。我希望单元格的颜色表示该单元格中数字的值,作为从红色到蓝色的平滑渐变,其中全蓝色表示网格中的最小值,全红色表示最大值 我遇到的问题是,当我调用setcellbackgroundcolor时,单元格并不总是改变,或者不完全改变。例如,有时当我更改单元格的值时,只有部分单元格将更改颜色,或者整个单元格将变为完全蓝色或完全红色。通常,如果我给它一秒钟,在不同的单元格中点击,它最终会找到自己,看

我正在用wxPython编写一个小程序,它显示一个有限大小的浮点数网格,该网格以numpy数组的形式并行存储。我希望单元格的颜色表示该单元格中数字的值,作为从红色到蓝色的平滑渐变,其中全蓝色表示网格中的最小值,全红色表示最大值

我遇到的问题是,当我调用
setcellbackgroundcolor
时,单元格并不总是改变,或者不完全改变。例如,有时当我更改单元格的值时,只有部分单元格将更改颜色,或者整个单元格将变为完全蓝色或完全红色。通常,如果我给它一秒钟,在不同的单元格中点击,它最终会找到自己,看起来是正确的

下面是我附加到wx.grid.EVT\u grid\u CELL\u CHANGE的事件处理程序:

def onGridChange(self, evt):
    row, col = evt.GetRow(), evt.GetCol()
    value = float(self.myGrid.GetTable().GetValue(row, col))
    self.table[row][col] = value
    self.update_colors()
    evt.Skip()

def update_colors(self):
    table_min = self.table.min()
    table_max = max(table_min + 1, self.table.max()) # to avoid dividing by zero later on.
    table_range = table_max - table_min
    for row in range(self.num_rows):
        for col in range(self.num_cols):
            percentage = (self.table[row][col]-table_min)/table_range
            color = (int(255*percentage), 0, int(255*(1.-percentage)))
            self.myGrid.SetCellBackgroundColour(row, col, color)

正如@jozzas所指出的,每当更新当前活动单元格之外的单元格时,我需要在网格上运行一个
self.myGrid.ForceRefresh()
。这解决了我的问题!谢谢

您是否尝试在
setCellBackgroundColor
调用后添加
self.myGrid.ForceRefresh()
?你也可以尝试刷新整个窗口。这很有效,谢谢!该问题仅在范围更改时发生,即当前选定单元格之外的单元格正在更改颜色。现在我将其设置为
ForceRefresh
,仅当新值超出以前的范围时。