В настоящее время я использую фреймворк wxPython, и мой код выглядит так:
Привязка события:
self.frequency_grid.Bind(wx.grid.EVT_GRID_CELL_CHANGE, self.on_cell_changed)
Функция, которая обрабатывает измененные ячейки:
def on_cell_changed(self, event):
self.current_grid = event.GetEventObject()
try:
new_value= self.get_cell_value()
if new_value < 0:
raise AttributeError
#allow the cell to update
except AttributeError:
event.Veto()
wx.MessageBox(_("Positive values only."), "", wx.OK|wx.ICON_WARNING)
except:
wx.MessageBox(_("Invalid value for cell."), "", wx.OK|wx.ICON_WARNING)
event.Veto()
Функция get_cell_value() считывает значение из текущей ячейки и преобразует его в целое число, просто используя функцию int(). Если пользователь вводит в ячейку такой символ, как «а», очевидно, что эта функция не работает, и возникает исключение. В этом случае появляется окно сообщения, сообщающее пользователю, что ячейка имеет недопустимое значение. Это то, что я называю автоматически вызванным исключением, и выполняется последний блок исключения.
В случае отрицательных значений я вручную вызываю AttributeError (просто хотел увидеть что-то отличное от ValueError, что происходит, когда пользователь вводит символы). Однако в этом случае wxPython дважды отправляет событие EVT_GRID_CELL_CHANGE, поэтому в исключениях, вызванных вручную, должно быть что-то другое.
Я отдельно поднял тикет о повторяющихся событиях по адресу http://trac.wxwidgets.org/ticket/16333 но просто пытаюсь понять, почему первый сценарий не заставляет wxPython отправлять 2 события по сравнению со вторым сценарием.