wxGrid with custom wxGridTableBase crashes while resizing of columns

Hi!

I have a wxGrid object with a custom grid base, which "produces"
tables with different count of rows and columns and different sets of
columns labels. It works fine, but when I try to call the
AutoSizeColumns() method of my wxGrid object and then change the table
to be shown inside it, the program crashes with core dump. The same
happens when I try to manually change size of a column and then go to
another table again.

Widgets insertion diagram:
wxGrid -> wxSplitterWindow -> wxBoxSizer -> wxPanel -> wxFrame

System: FreeBSD 4.7-STABLE, wxGTK-2.4.0, wxPython-2.4.0.7, gtk-1.2.10.

Here are some fragments of the source:

···

--------------------
class MyFrame( wxFrame ):
    ...
    def StateChanged( self,dummy ):
        self.grid.BeginBatch()
        
        self.gridBase.TableStateChanged()
        self.grid.SetGridCursor( 0,0 )
        self.grid.MakeCellVisible( 0,0 )
        self.grid.AdjustScrollbars()
        self.grid.AutoSizeColumns() ## the program crashes here!
        self.grid.ForceRefresh()

        self.grid.EndBatch()

class MyGridBase( wxPyGridTableBase ):

    self.fields = .... ## tuple of tuples of strings
    
    def __init__( self,data,table ):
        wxPyGridTableBase.__init__( self )
        self.data = data
        self.table = table
        self.rowcount = self.colcount = 0

    def TableStateChanged( self ):
        ## ... some calculations on self.data ...

        rowcount = len( self.data )
        colcount = len( self.data[ 0 ] )

        msg1 = wxGridTableMessage( self,wxGRIDTABLE_NOTIFY_ROWS_APPENDED,rowcount - self.rowcount )
        msg2 = wxGridTableMessage( self,wxGRIDTABLE_NOTIFY_COLS_APPENDED,colcount - self.colcount )
        msg3 = wxGridTableMessage( self,wxGRIDTABLE_REQUEST_VIEW_GET_VALUES )

        for msg in [ msg1,msg2,msg3 ]:
            self.GetView().ProcessTableMessage( msg )

        self.rowcount = rowcount
        self.colcount = colcount

    def GetNumberRows( self ):
        if self.data:
            return len( self.data )
        return 0

    def GetNumberCols( self ):
        if self.data:
            return len( self.data[ 0 ] )
        return 0

    def IsEmptyCell( self,row,col ):
        return false ## there are no empty cells, see GetValue()

    def GetValue( self,row,col ):
        if self.data:
            try:
                return self.data[ row ][ self.fields[ self.table[ "appe" ]][ col ]]
            except KeyError:
                return "?"

    def GetColLabelValue( self,col ):
        if self.data:
            return self.fields[ self.table[ "appe" ]][ col ]

    def SetValue( self,row,col,value ):
        pass ## the grid is not editable
--------------------

Any ideas?

With best regards,
Dmytro Rud.

Dmytro Rud wrote:

        Hi!

I have a wxGrid object with a custom grid base, which "produces"
tables with different count of rows and columns and different sets of
columns labels. It works fine, but when I try to call the
AutoSizeColumns() method of my wxGrid object and then change the table
to be shown inside it, the program crashes with core dump. The same
happens when I try to manually change size of a column and then go to
another table again.

Widgets insertion diagram: wxGrid -> wxSplitterWindow -> wxBoxSizer -> wxPanel -> wxFrame

System: FreeBSD 4.7-STABLE, wxGTK-2.4.0, wxPython-2.4.0.7, gtk-1.2.10.

Here are some fragments of the source:

I don't see anything wrong with a quick glance at the snippets you showed, if you can reduce it to a small sample I'll take a closer look.

···

--
Robin Dunn
Software Craftsman
http://wxPython.org Java give you jitters? Relax with wxPython!

Q29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0NCkNvbnRlbnQtRGlzcG9zaXRp
b246IGF0dGFjaG1lbnQ7IGZpbGVuYW1lPXRhYmxlZGVtby5weQ0KQ29udGVudC1EZXNjcmlwdGlv
bjogcHl0aG9uIHNvdXJjZQ0KDQpmcm9tIHd4UHl0aG9uLnd4IGltcG9ydCAqCmZyb20gd3hQeXRo
b24uZ3JpZCBpbXBvcnQgKgpmcm9tIHJhbmRvbSBpbXBvcnQgKgoKCmNsYXNzIERlbW9UYWJsZUdy
aWRCYXNlKCB3eFB5R3JpZFRhYmxlQmFzZSApOgoKICAgICMgZHVtbXkgY29sdW1uIG5hbWVzCiAg
ICBmaWVsZHMgPSAoICJOZXR3b3JrIiwiUm91dGVyIiwiV29ybGQiLCJEb2ciLCJDYXQiLCJTTk1Q
Iiwid3hXaW5kb3dzIiwiUHl0aG9uIiwiRG15dHJvIiwiUnVkIiwKICAgICAgICAgICAgICAgIkZy
ZWVCU0QiLCJMaW51eCIsIlVuaXgiLCJFbmdsaXNoIiwiR2VybWFuIiwiSG9yc2UiLCJDb3ciLCJB
dCIsIkFpcnBsYW5lIiwiQ2hpbmVzZSIgKQoKICAgIGRlZiBfX2luaXRfXyggc2VsZiApOgogICAg
ICAgIHd4UHlHcmlkVGFibGVCYXNlLl9faW5pdF9fKCBzZWxmICkKICAgICAgICBzZWVkKCkKICAg
ICAgICBzZWxmLmNvbGNvdW50ID0gcmFuZGludCggMTAsMzAgKQogICAgICAgIHNlbGYucm93Y291
bnQgPSByYW5kaW50KCAxMCwzMCApCiAgICAgICAgc2VsZi5yYW5kb21pemVDb2xMYWJlbHNBbmRE
YXRhKCkKCiAgICBkZWYgR2V0Q29sTGFiZWxWYWx1ZSggc2VsZixjb2wgKToKICAgICAgICByZXR1
cm4gc2VsZi5jb2xsYWJlbHNbIGNvbCBdCiAgICAKICAgIGRlZiBHZXRWYWx1ZSggc2VsZixyb3cs
Y29sICk6CiAgICAgICAgcmV0dXJuIHNlbGYuZGF0YVsgcm93ICogc2VsZi5jb2xjb3VudCArIGNv
bCBdCgogICAgZGVmIEdldE51bWJlclJvd3MoIHNlbGYgKToKICAgICAgICByZXR1cm4gc2VsZi5y
b3djb3VudAoKICAgIGRlZiBHZXROdW1iZXJDb2xzKCBzZWxmICk6CiAgICAgICAgcmV0dXJuIHNl
bGYuY29sY291bnQKCiAgICBkZWYgaXNFbXB0eSggc2VsZixyb3csY29sICk6CiAgICAgICAgcmV0
dXJuIGZhbHNlCgogICAgZGVmIFNldFZhbHVlKCBzZWxmLHJvdyxjb2wsdmFsdWUgKToKICAgICAg
ICBwYXNzCgogICAgZGVmIHJhbmRvbWl6ZUNvbExhYmVsc0FuZERhdGEoIHNlbGYgKToKICAgICAg
ICBzZWxmLmNvbGxhYmVscyA9IG1hcCggbGFtYmRhIHg6IHNlbGYuZmllbGRzWyByYW5kaW50KCAw
LGxlbiggc2VsZi5maWVsZHMgKSAtIDEgKSBdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICByYW5nZSggc2VsZi5jb2xjb3VudCApKQogICAgICAgIHNlbGYuZGF0YSA9IG1hcCggbGFtYmRh
IHg6IGByYW5kaW50KCAwLDEwMDAgKWAscmFuZ2UoIHNlbGYuY29sY291bnQgKiBzZWxmLnJvd2Nv
dW50ICkpCgogICAgZGVmIG5leHRUYWJsZSggc2VsZiApOgogICAgICAgIGNvbGNvdW50ID0gcmFu
ZGludCggMTAsMzAgKQogICAgICAgIHJvd2NvdW50ID0gcmFuZGludCggMTAsMzAgKQoKICAgICAg
ICBtc2cxID0gd3hHcmlkVGFibGVNZXNzYWdlKCBzZWxmLHd4R1JJRFRBQkxFX05PVElGWV9ST1dT
X0FQUEVOREVELHJvd2NvdW50IC0gc2VsZi5yb3djb3VudCApCiAgICAgICAgbXNnMiA9IHd4R3Jp
ZFRhYmxlTWVzc2FnZSggc2VsZix3eEdSSURUQUJMRV9OT1RJRllfQ09MU19BUFBFTkRFRCxjb2xj
b3VudCAtIHNlbGYuY29sY291bnQgKQogICAgICAgIG1zZzMgPSB3eEdyaWRUYWJsZU1lc3NhZ2Uo
IHNlbGYsd3hHUklEVEFCTEVfUkVRVUVTVF9WSUVXX0dFVF9WQUxVRVMgKSAKICAgICAgICAKICAg
ICAgICBmb3IgbXNnIGluIFsgbXNnMSxtc2cyLG1zZzMgXToKICAgICAgICAgICAgc2VsZi5HZXRW
aWV3KCkuUHJvY2Vzc1RhYmxlTWVzc2FnZSggbXNnICkKICAgICAgICAKICAgICAgICBzZWxmLnJv
d2NvdW50ID0gcm93Y291bnQKICAgICAgICBzZWxmLmNvbGNvdW50ID0gY29sY291bnQKICAgICAg
ICAKICAgICAgICBzZWxmLnJhbmRvbWl6ZUNvbExhYmVsc0FuZERhdGEoKQoKCmNsYXNzIERlbW8o
IHd4RnJhbWUgKToKICAgIGRlZiBfX2luaXRfXyggc2VsZixwYXJlbnQsKiprd2FyZ3MgKToKICAg
ICAgICB3eEZyYW1lLl9faW5pdF9fKCBzZWxmLHBhcmVudCwtMSwiRGVtbyIsKiprd2FyZ3MgKQog
ICAgICAgIAogICAgICAgIHBhbmVsID0gd3hQYW5lbCggc2VsZiwtMSApCgogICAgICAgIHNwbGl0
dGVyID0gIHd4U3BsaXR0ZXJXaW5kb3coIHBhbmVsLC0xICkKICAgICAgICBzcGxpdHRlci5TZXRN
aW5pbXVtUGFuZVNpemUoIDUwICkKCiAgICAgICAgc2VsZi5ncmlkID0gd3hHcmlkKCBzcGxpdHRl
ciwtMSApCiAgICAgICAgc2VsZi5ncmlkQmFzZSA9IERlbW9UYWJsZUdyaWRCYXNlKCkKICAgICAg
ICBzZWxmLmdyaWQuU2V0VGFibGUoIHNlbGYuZ3JpZEJhc2UgKQoKICAgICAgICBzcGxpdHRlci5T
cGxpdFZlcnRpY2FsbHkoIHd4TGlzdEJveCggc3BsaXR0ZXIsLTEsY2hvaWNlcyA9IFsgIjEiLCIy
IiwiMyIgXSApLHNlbGYuZ3JpZCwxMzAgKQoKICAgICAgICBiUmFuZG9tSWQgPSB3eE5ld0lkKCkK
ICAgICAgICBiUmFuZG9tID0gd3hCdXR0b24oIHBhbmVsLGJSYW5kb21JZCwiUmFuZG9taXplIChn
ZXQgbmV3IHRhYmxlKSIgKQogICAgICAgICAgICAKICAgICAgICBzeiA9IHd4Qm94U2l6ZXIoIHd4
VkVSVElDQUwgKQogICAgICAgIHN6LkFkZE1hbnkoIFsgKCBzcGxpdHRlciwxLHd4RVhQQU5EIHwg
d3hBTEwsMTAgKSwKICAgICAgICAgICAgICAgICAgICAgICggYlJhbmRvbSwwLHd4Qk9UVE9NIHwg
d3hBTElHTl9DRU5URVJfSE9SSVpPTlRBTCwxMCApIF0gKQoKICAgICAgICBwYW5lbC5TZXRTaXpl
ciggc3ogKQogICAgICAgIHBhbmVsLlNldEF1dG9MYXlvdXQoIHRydWUgKQoKICAgICAgICBFVlRf
QlVUVE9OKCBzZWxmLGJSYW5kb21JZCxzZWxmLk9uUmFuZG9taXplICkKCgogICAgZGVmIE9uUmFu
ZG9taXplKCBzZWxmLGV2ZW50ICk6CiAgICAgICAgc2VsZi5ncmlkQmFzZS5uZXh0VGFibGUoKQog
ICAgICAgIHNlbGYuZ3JpZC5BdXRvU2l6ZUNvbHVtbnMoKQogICAgICAgIHNlbGYuZ3JpZC5Gb3Jj
ZVJlZnJlc2goKQoKCgpjbGFzcyBEZW1vQXBwKCB3eEFwcCApOgogICAgZGVmIE9uSW5pdCggc2Vs
ZiApOgogICAgICAgIGRlbW8gPSBEZW1vKCBOb25lLHNpemUgPSAoIDUwMCwzMDAgKSkKICAgICAg
ICBkZW1vLlNob3coIHRydWUgKQogICAgICAgIHNlbGYuU2V0VG9wV2luZG93KCBkZW1vICkKICAg
ICAgICByZXR1cm4gdHJ1ZQoKCmFwcCA9IERlbW9BcHAoIDAgKQphcHAuTWFpbkxvb3AoKQogICAg
ICAgIAoKICAgICAgICAKICAgIAogICAgICAgICAgICAKCgoKLS0gCiAgICAgICAgcm5kLgo=