为什么 SetCellEditor 在 self.m_grid_3.ClearGrid() 之后重新应用时会导致错误
Why does SetCellEditor cause error when reapplied after self.m_grid_3.ClearGrid()
每次使用组合框 select 新值时,以下代码都会填充一个网格。
代码第一次运行时运行良好,并创建了一个填充网格,在第 4 列的每个单元格中都有一个下拉菜单。但是,当我 select 第二个新值并且函数执行 self.m_grid_3.ClearGrid( ) 并重新填充我收到以下错误。
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\grid.py", line 2000, in SetCellEditor
return _grid.Grid_SetCellEditor(*args, **kwargs)
TypeError: in method 'Grid_SetCellEditor', expected argument 4 of type 'wxGridCellEditor *'
在 col4 中选择下拉菜单然后崩溃 python。
关于如何解决这个问题的任何想法。
这是有问题的代码。
class Inspection(BulkUpdate):
def __init__(self, parent):
BulkUpdate.__init__(self, parent)
list = EmployeeList()
list_climbers = list.get_climbers()
for name in list_climbers:
self.edit_kit_comboBox.Append(str(name.employee))
choices = ["Yes", "No", "Not Checked"]
self.choice_editor = wx.grid.GridCellChoiceEditor(choices, True)
def on_engineer_select( self, event ):
self.m_grid3.ClearGrid()
person = self.edit_kit_comboBox.GetValue()
list = KitList()
equipment = list.list_of_equipment(person, 1)
rows = len(equipment)
for row in range(0, rows):
for col in range(0, 5):
print "row = %s col = %s" % (row, col)
if col == 4:
self.m_grid3.SetCellValue(row, col+2, str(equipment[row][col]))
self.m_grid3.SetCellValue(row, col, "Pass")
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
else:
self.m_grid3.SetCellValue(row, col, str(equipment[row][col]))
代码在第二次填充网格时停止在第二个循环中。
这几天我一直在努力解决这个问题。
尝试将此添加到 __init__
:
self.choice_editor.IncRef()
我的猜测是当您调用 ClearGrid
时编辑器对象的 C++ 部分被删除了。给它额外的参考告诉网格你想保留它。
回答添加
self.choice_editor.IncRef()
我将选择列表定义与
一起移到了函数中
self.choice_editor.IncRef()
所以现在看起来像这样
def on_engineer_select( self, event ):
self.m_grid3.ClearGrid()
choices = ["Pass", "Fail", "Not Checked"]
self.choice_editor = wx.grid.GridCellChoiceEditor(choices, False)
person = self.edit_kit_comboBox.GetValue()
list = KitList()
equipment = list.list_of_equipment(person, 1)
print "Length of equipment = %s" % len(equipment)
rows = len(equipment)
for row in range(0, rows):
for col in range(0, 5):
print "row = %s col = %s" % (row, col)
if col == 4:
self.choice_editor.IncRef()
self.m_grid3.SetCellValue(row, col+2, str(equipment[row][col]))
self.m_grid3.SetCellValue(row, col+1, str(date.today()))
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
self.m_grid3.SetCellValue(row, col, "Pass")
else:
self.m_grid3.SetCellValue(row, col, str(equipment[row][col]))
现在代码可以正常工作了。
每次使用组合框 select 新值时,以下代码都会填充一个网格。 代码第一次运行时运行良好,并创建了一个填充网格,在第 4 列的每个单元格中都有一个下拉菜单。但是,当我 select 第二个新值并且函数执行 self.m_grid_3.ClearGrid( ) 并重新填充我收到以下错误。
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
File "C:\Python27\lib\site-packages\wx-3.0-msw\wx\grid.py", line 2000, in SetCellEditor
return _grid.Grid_SetCellEditor(*args, **kwargs)
TypeError: in method 'Grid_SetCellEditor', expected argument 4 of type 'wxGridCellEditor *'
在 col4 中选择下拉菜单然后崩溃 python。
关于如何解决这个问题的任何想法。
这是有问题的代码。
class Inspection(BulkUpdate):
def __init__(self, parent):
BulkUpdate.__init__(self, parent)
list = EmployeeList()
list_climbers = list.get_climbers()
for name in list_climbers:
self.edit_kit_comboBox.Append(str(name.employee))
choices = ["Yes", "No", "Not Checked"]
self.choice_editor = wx.grid.GridCellChoiceEditor(choices, True)
def on_engineer_select( self, event ):
self.m_grid3.ClearGrid()
person = self.edit_kit_comboBox.GetValue()
list = KitList()
equipment = list.list_of_equipment(person, 1)
rows = len(equipment)
for row in range(0, rows):
for col in range(0, 5):
print "row = %s col = %s" % (row, col)
if col == 4:
self.m_grid3.SetCellValue(row, col+2, str(equipment[row][col]))
self.m_grid3.SetCellValue(row, col, "Pass")
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
else:
self.m_grid3.SetCellValue(row, col, str(equipment[row][col]))
代码在第二次填充网格时停止在第二个循环中。 这几天我一直在努力解决这个问题。
尝试将此添加到 __init__
:
self.choice_editor.IncRef()
我的猜测是当您调用 ClearGrid
时编辑器对象的 C++ 部分被删除了。给它额外的参考告诉网格你想保留它。
回答添加
self.choice_editor.IncRef()
我将选择列表定义与
一起移到了函数中self.choice_editor.IncRef()
所以现在看起来像这样
def on_engineer_select( self, event ):
self.m_grid3.ClearGrid()
choices = ["Pass", "Fail", "Not Checked"]
self.choice_editor = wx.grid.GridCellChoiceEditor(choices, False)
person = self.edit_kit_comboBox.GetValue()
list = KitList()
equipment = list.list_of_equipment(person, 1)
print "Length of equipment = %s" % len(equipment)
rows = len(equipment)
for row in range(0, rows):
for col in range(0, 5):
print "row = %s col = %s" % (row, col)
if col == 4:
self.choice_editor.IncRef()
self.m_grid3.SetCellValue(row, col+2, str(equipment[row][col]))
self.m_grid3.SetCellValue(row, col+1, str(date.today()))
self.m_grid3.SetCellEditor(row, col, self.choice_editor)
self.m_grid3.SetCellValue(row, col, "Pass")
else:
self.m_grid3.SetCellValue(row, col, str(equipment[row][col]))
现在代码可以正常工作了。