wxPython事件的顺序给我带来了问题

时间:2012-01-09 02:12:33

标签: python wxpython wxwidgets

我的GUI由左侧的wx.ListCtrl和一个要编辑的对象列表以及右侧的一组wx.TextCtrl组成,用于编辑所选对象。

我实施此计划的策略是:

  • 在文本框的wx.EVT_KILL_FOCUS上,更新当前所选对象的相关属性
  • 在列表的wx.EVT_LIST_ITEM_DESELECTED上,隐藏文本框或将其删除并禁用它们(当用户单击列表控件中的空格时需要)
  • 在列表的wx.EVT_LIST_ITEM_SELECTED上,使用所选对象的属性值填充文本控件

使用此设置,有3个用例,其中2个有效:

  1. 当用户在文本框之间单击/标签时,会出现正确的wx.EVT_KILL_FOCUS,并且属性会更新。

  2. 当用户从文本框点击列表中的空白区域时,也可以:首先wx.EVT_KILL_FOCUS导致属性更新,然后wx.EVT_LIST_ITEM_DESELECTED隐藏文本框。< / p>

  3. 问题是当用户直接从文本框单击列表控件中的另一个对象时。在这种情况下,事件的顺序是wx.EVT_LIST_ITEM_DESELECTEDwx.EVT_LIST_ITEM_SELECTED,最后是wx.EVT_KILL_FOCUS。您可能会看到问题:在调用更新属性的方法时,已经选择了一个新对象,并且文本框中已填充了新值。

  4. 所以我确切地知道问题是什么,但我无法想出一个好的,干净的方法来解决它。理想情况下,我希望能够改变wx事件的顺序(将wx.EVT_KILL_FOCUS放在前面),但我怀疑这是可能的。还有其他一些明显的解决方案吗?

2 个答案:

答案 0 :(得分:1)

wx.EVT_LIST_ITEM_DESELECTED仅在用户更改列表框中的选定对象时触发。这与失去对文本框的关注的目的相同。同样调用该事件的更新例程。要从文本框中跳过后续的wx.EVT_KILL_FOCUS,请在更新属性后在父对象中设置“isDirty”属性。您可以随时检查isDirty值以确认是否有提交更改。填充新选择的文本框然后在其他文本框事件期间设置时,必须重置此属性。

答案 1 :(得分:1)

在我看来,你正试图从头开始重新实现wxListbook的功能。这似乎很多工作,也许你可以使用wxListbook  做你需要的。

http://docs.wxwidgets.org/2.9.4/classwx_listbook.html