尝试在更改网格单元格中的 CellEditor 时触发事件
Trying to trigger event when a CellEditor in a Grid cell is changed
我有一个 table,它在使用 wxFormBuilder 创建的 window 中显示作业详细信息。 table 有一个标记为 Finance 的财务列,在每一行(记录)中包含一个组合框(SetCellEditor)。
组合框保存数组中的值
finance_options = ['Not Started', 'Preparing Day Sheets', 'Day Sheets Sent', 'PO Received', 'Partially Invoiced', 'Fully Invoiced']
当我更改此下拉列表时,我想调用一个名为 onFinanceChanged 的方法。
我通常会使用 wxFormBuilder 中的选项将方法分配给 cellChanged 事件,但如果 table 中的任何单元格发生更改,就会触发。
def populate_job_grid(self, jobs):
finance_options = ['Not Started', 'Preparing Day Sheets', 'Day Sheets Sent', 'PO Received',
'Partially Invoiced', 'Fully Invoiced']
for i in range(0, len(jobs)):
self.jobNumberGrid.InsertRows(0)
row = 0
for job in jobs:
year = arrow.get(job.created_at).date()
job_year = str(year.year)[2:]
self.jobNumberGrid.SetCellValue(row, 0, str(job.job_no))
self.jobNumberGrid.SetCellValue(row, 1, job_year)
self.jobNumberGrid.SetCellValue(row, 2, str(job.site))
self.jobNumberGrid.SetCellValue(row, 3, str(job.client.name))
self.jobNumberGrid.SetCellValue(row, 4, str(job.job_description))
self.jobNumberGrid.SetCellValue(row, 5, str(job.user.name))
created = arrow.get(job.created_at).date()
created_at = datetime.datetime.strptime(str(created), "%Y-%m-%d").strftime("%d-%m-%Y")
self.jobNumberGrid.SetCellValue(row, 6, created_at)
self.jobNumberGrid.SetCellValue(row, 7, job.finance)
finance = wx.grid.GridCellChoiceEditor(finance_options, allowOthers=True)
self.jobNumberGrid.SetCellEditor(row, 7, finance).Bind(self.jobNumberGrid.EVT_GRID_CELL_CHANGED,
self.onFinanceChange)
row = row + 1
如您所见,我尝试将 EVT_GRID_CELL_CHANGED 绑定到单元格,但这会导致 "AttributeError: 'NoneType' object has no attribute 'Bind'" 错误。
有什么想法吗?
谢谢保罗。
SetCellEditor
没有 return 值,因此没有任何东西可以用来调用 Bind
。相反,您应该使用 self.jobNumberGrid
来绑定事件处理程序。任何单元格值更改都会调用它,但您可以获取已更改单元格的行、列,然后忽略它,或者根据事件来自哪一列调用 self.onFinanceChange
。
我有一个 table,它在使用 wxFormBuilder 创建的 window 中显示作业详细信息。 table 有一个标记为 Finance 的财务列,在每一行(记录)中包含一个组合框(SetCellEditor)。
组合框保存数组中的值
finance_options = ['Not Started', 'Preparing Day Sheets', 'Day Sheets Sent', 'PO Received', 'Partially Invoiced', 'Fully Invoiced']
当我更改此下拉列表时,我想调用一个名为 onFinanceChanged 的方法。
我通常会使用 wxFormBuilder 中的选项将方法分配给 cellChanged 事件,但如果 table 中的任何单元格发生更改,就会触发。
def populate_job_grid(self, jobs):
finance_options = ['Not Started', 'Preparing Day Sheets', 'Day Sheets Sent', 'PO Received',
'Partially Invoiced', 'Fully Invoiced']
for i in range(0, len(jobs)):
self.jobNumberGrid.InsertRows(0)
row = 0
for job in jobs:
year = arrow.get(job.created_at).date()
job_year = str(year.year)[2:]
self.jobNumberGrid.SetCellValue(row, 0, str(job.job_no))
self.jobNumberGrid.SetCellValue(row, 1, job_year)
self.jobNumberGrid.SetCellValue(row, 2, str(job.site))
self.jobNumberGrid.SetCellValue(row, 3, str(job.client.name))
self.jobNumberGrid.SetCellValue(row, 4, str(job.job_description))
self.jobNumberGrid.SetCellValue(row, 5, str(job.user.name))
created = arrow.get(job.created_at).date()
created_at = datetime.datetime.strptime(str(created), "%Y-%m-%d").strftime("%d-%m-%Y")
self.jobNumberGrid.SetCellValue(row, 6, created_at)
self.jobNumberGrid.SetCellValue(row, 7, job.finance)
finance = wx.grid.GridCellChoiceEditor(finance_options, allowOthers=True)
self.jobNumberGrid.SetCellEditor(row, 7, finance).Bind(self.jobNumberGrid.EVT_GRID_CELL_CHANGED,
self.onFinanceChange)
row = row + 1
如您所见,我尝试将 EVT_GRID_CELL_CHANGED 绑定到单元格,但这会导致 "AttributeError: 'NoneType' object has no attribute 'Bind'" 错误。
有什么想法吗?
谢谢保罗。
SetCellEditor
没有 return 值,因此没有任何东西可以用来调用 Bind
。相反,您应该使用 self.jobNumberGrid
来绑定事件处理程序。任何单元格值更改都会调用它,但您可以获取已更改单元格的行、列,然后忽略它,或者根据事件来自哪一列调用 self.onFinanceChange
。