【发布时间】:2014-06-18 00:36:43
【问题描述】:
目前使用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() 将其转换为整数。如果用户在单元格中输入像“a”这样的字符,显然这个函数会失败并引发异常。在这种情况下,消息框会告诉用户单元格的值无效。这就是我所说的自动引发的异常,执行最后的异常块。
在负值的情况下,我手动引发了一个 AttributeError(只是想看看与 ValueError 不同的东西,这是用户输入字符时发生的情况)。 然而,在这种情况下,wxPython 会发送两次 EVT_GRID_CELL_CHANGE 事件,因此手动引发的异常肯定有所不同。
我已经在http://trac.wxwidgets.org/ticket/16333 单独提出了关于重复事件的票证,但只是想了解第一个场景与第二个场景相比如何不会使 wxPython 发送 2 个事件。
【问题讨论】: