2010-07-02 4 views
3

데이터를 제공하기 위해 wx.grid.PyGridTableBase 파생 클래스로 wx.grid.Grid를 만들었습니다. 나는 또한 테이블에서 사용되는 편집기를 제어하려고합니다. 그 목적을 위해 다음 방법을 정의했습니다.편집자와 wxPython 세분화 오류

def GetAttr(self, row, col, kind): 
    attr = wx.grid.GridCellAttr() 
    if col == 0: 
     attr.SetEditor(wx.grid.GridCellChoiceEditor()) 
    return attr 

그러나 그리드에서 편집기를 만들려고 할 때마다 세그먼트 화 오류가 발생합니다. 나는 미리 편집기를 작성하고 매개 변수로 전달하려고했지만 오류 접수 :

TypeError: in method 'GridCellAttr_SetEditor', expected argument 2 of type 
'wxGridCellEditor *' 

내가 두 번째 오류가 소유권을 이륙 한 후 내 편집기를 파괴 GridCellAttr에 의해 발생 의심을.

또한 wx.grid.Grid에서 SetDefaultEditor 메서드를 사용하여 시도했지만 제대로 작동하지만 자연스럽게 열 특정 편집 전략을 가질 수 없습니다. 충돌 프로그램의

참조 전체 예 :

import wx 
import wx.grid as gridlib 

을 변경 : http://pastebin.com/SEbhvaKf

답변

4

나는이 문제를 알아 냈어 :

wxWidgets에 코드가 같은 편집기를 지속적으로 GetCellAttr에서 반환 될 것으로 가정합니다. 내가 분할 오류를 야기하고 있던 같은 다른 편집기마다 반환.

동일한 편집기를 여러 번 반환하려면 편집기에서 IncRef()를 호출하여 계속 유지해야합니다. 그냥 WX, 당신은 속성의 오류가 발생하지 않습니다 대신 wx.grid 가져 오는 경우

import wx.grid 

app = wx.PySimpleApp() 

class Source(wx.grid.PyGridTableBase): 
    def __init__(self): 
     super(Source, self).__init__() 
     self._editor = wx.grid.GridCellChoiceEditor() 

    def IsEmptyCell(self, row, col): 
     return False 

    def GetValue(self, row, col): 
     return repr((row, col)) 

    def SetValue(self, row, col, value): 
     pass 

    def GetNumberRows(self): 
     return 5 

    def GetNumberCols(self): 
     return 5 

    def GetAttr(self, row, col, kind): 
     attr = wx.grid.GridCellAttr() 
     self._editor.IncRef() 
     attr.SetEditor(self._editor) 
     return attr 


frame = wx.Frame(None) 
grid = wx.grid.Grid(frame) 
grid.SetTable(Source()) 
frame.Show() 

app.MainLoop() 
0

이 그것을 해결해야

def GetAttr(self, row, col, kind): 
    attr = gridlib.GridCellAttr() 
    if col == 0: 
     attr.SetEditor(gridlib.GridCellChoiceEditor()) 
    return attr 

것을 제외 : 당신이 그것을 할 필요가 왜 아무 생각을 이 방법으로 인해 :

>>> import wx 
>>> attr = wx.grid.GridCellAttr() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'module' object has no attribute 'grid' 
,

작동하지만하지 마십시오

import wx.grid as gridlib 
attr = gridlib.GridCellAttr() 

작품을 ...하지만 :

print attr 
<wx.grid.GridCellAttr; proxy of <wx.grid.GridCellAttr; proxy of <Swig Object of type 'wxGridCellAttr *' at 0x97cb398> > > 

그것은 말한다 : <wx.grid.GridCellAttr; proxy of <wx.grid.GridCellAttr>...>를!

Obs2 : 당신이 전체 열 0에 ChoiceEditor를 사용하는 경우, 당신은 또한 하나의 시간 그리드를 표시하기 전에 그것을 정의 할 수 있습니다 :

attr.SetEditor(gridlib.GridCellChoiceEditor()) 
yourGrid.SetColAttr(0, attr) 

하고 GetAttr 방법에서 모든 코드를 제거 할 수 있습니다 (나는 그것이 더 빨라야한다고 생각한다.

+0

: 다른 미래에 같은 문제를 치는 사람을 위해

, 내 작업 코드를 참조하십시오. 기타 가져 오기 스타일을 변경하면 수정해야 할 작업이 무엇인지 알 수 없습니다. SetColAttr를 사용 잘 작동하고, 감사를 할 수있는 더 좋은 방법입니다. 하지만 내가 세그멘테이션 오류를 얻는 이유를 알고 싶습니다 ... –

+0

예, 정확하게는 가져 오기 스타일을 변경하는 것입니다. 콘솔 출력에서 ​​볼 수 있듯이,'wx.grid' 대신에'wx'를 가져 오면 wx.grid의 오브젝트가 작동하지 않습니다. 가져온 경우 개체가'wx.grid'로 나열되기 때문에 왜 그런지 모르겠습니다. 어쨌든, 이것은 항상 귀하의 경우에만이 방법입니다. 에디터를 사용할 때만 세그먼테이션 오류가 발생했습니다. wx.grid로 제대로 초기화되지 않았기 때문에 유형이 잘못되었거나 유형이 없기 때문입니다. – laurent

+0

가져 오기 스타일을 변경해도 문제가 해결되지 않습니다. (예, 확실하게 시도했습니다) –