2013-02-04 63 views
1

我想創建一個GridCellChoiceEditor版本,它允許在運行時更改選項列表。原因是要顯示的選擇是對我的數據進行查詢的結果,因此每次使用編輯器時都可能會發生變化。我這樣做是繼承PyGridCellEditor,但是每當我運行它,創建編輯器後立即segfaults。這裏是我的代碼,簡化了測試使用靜態列表的目的,只有一個格:SEGFAULT與自定義wx.PyGridCellEditor

import wx 
import wx.grid 

class ListEditor(wx.grid.PyGridCellEditor): 

    def __init__(self, options): 
     super(ListEditor, self).__init__() 
     self.options = options 

    def ApplyEdit(self, row, col, grid): 
     grid.SetValue(row, col, self.value) 

    def BeginEdit(self, row, col, grid): 
     print('begin edit') 
     value = grid.GetValue(row, col) 
     index = self.options.index(value) 
     self.combo.SetOptions(self.options) 
     self.combo.SetIndex(index) 

    def Create(self, parent, id, evtHandler): 
     self.combo = wx.ComboBox(parent, id) 
     print('combo created') 

    def Clone(self): 
     return ListEditor(self.options) 

    def EndEdit(self, row, col, grid, oldval, newval): 
     if oldval == newval: 
      return False 
     else: 
      self.value = newval 
      return True 

    def Reset(self): 
     pass 

    def GetValue(self): 
     return 'a' 


class F(wx.Dialog): 

    def __init__(self): 
     super(F, self).__init__(None) 
     self.grid = wx.grid.Grid(self, -1, (0, 0), (300, 300)) 
     self.grid.CreateGrid(1, 1) 
     editor = ListEditor(['a', 'b', 'c']) 
     self.grid.SetCellEditor(0, 0, editor) 


app = wx.App(False) 
f = F() 
f.Show() 
app.MainLoop() 

誰能告訴我我要去哪裏錯了嗎?

+0

如果它發生了段錯誤,那麼你幾乎肯定不會做任何錯誤的事情,因爲無論你在wxPython中做什麼,它都不會崩潰。所以你可能應該報告這是一個錯誤... –

回答

1

在你的Create方法中,你需要調用self.SetControl(self.combo)讓編輯器基類知道什麼是真正的控制。你也應該做self.combo.PushEventHandler(evtHandler),這樣才能建立與網格的正確交互。