2010-03-16 7 views
1

Je souhaite utiliser l'éditeur de choix modifiable avec PyGridTableBase. Lorsque je modifie une cellule, il se bloque Quelle est l'erreur dans mon code? Mon code python:wxpython PyGridTableBase

import wx 
import wx.grid as gridlib 

class MyTableBase(gridlib.PyGridTableBase): 

    def __init__(self): 
     gridlib.PyGridTableBase.__init__(self) 

     self.data = {0:["value 1", "value 2"], 
        1:["value 3", "value 4", "value 5"]} 

     self.column_labels = [unicode(u"Label 1"), 
          unicode(u"Label 2"), 
          unicode(u"Label 3")] 



     self._rows = self.GetNumberRows() 
     self._cols = self.GetNumberCols() 

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

    def GetNumberRows(self): 
     return len(self.data.keys()) 

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

    def GetValue(self, row, col): 
     try: 
      if col > self.GetNumberCols(): 
       raise IndexError 
      return self.data[row][col] 
     except IndexError: 
      return None 

    def IsEmptyCell(self, row, col): 
     if self.data[row][col] is not None: 
      return True 
     else: 
      return False 

    def GetAttr(self, row, col, kind): 
     attr = gridlib.GridCellAttr() 
     editor = gridlib.GridCellChoiceEditor(["xxx", "yyy", "zzz"], 
              allowOthers = True) 
     attr.SetEditor(editor) 
     attr.IncRef() 
     return attr 

class MyDataGrid(gridlib.Grid): 
    def __init__(self, parent): 
     gridlib.Grid.__init__(self, parent, wx.NewId()) 
     self.base_table = MyTableBase() 
     self.SetTable(self.base_table) 


if __name__ == '__main__': 
    app = wx.App(redirect = False) 
    frame = wx.Frame(None, wx.NewId(), title = u"Test") 
    grid_ = MyDataGrid(frame) 
    frame.Show() 
    app.MainLoop() 

Répondre

3

J'ai eu le même problème ici:

wxPython segmentation fault with Editors

Fondamentalement, vous devez définir la même instance de l'éditeur à chaque fois GetAttr est appelé plutôt créer alors une nouvelle à chaque fois que l'objet de l'éditeur.