Порядок событий wxPython вызывает у меня проблемы - PullRequest
0 голосов
/ 09 января 2012

Мой графический интерфейс состоит из 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 скрывает текстовые поля.

  3. Проблема заключается в том, что пользователь щелкает непосредственно из текстового поля другому объекту в элементе управления списком.Порядок событий в этом случае wx.EVT_LIST_ITEM_DESELECTED, wx.EVT_LIST_ITEM_SELECTED, а затем, наконец, wx.EVT_KILL_FOCUS.Возможно, вы видите проблему: к тому времени, когда вызывается метод, который обновляет атрибуты, новый объект уже выбран, и текстовые поля заполнены новыми значениями.

Итак, я знаюименно в чем проблема, но я не могу придумать хороший, чистый способ ее исправить.В идеале я хотел бы иметь возможность изменить порядок событий wx (поместив wx.EVT_KILL_FOCUS впереди), но я сомневаюсь, что это возможно.Есть ли какое-то другое очевидное решение, которое мне не хватает?

Ответы [ 2 ]

1 голос
/ 12 января 2012

Мне кажется, что вы пытаетесь заново реализовать функциональность wxListbook.Это кажется большой работой, возможно, вы можете использовать wxListbook, чтобы делать то, что вам нужно.

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

1 голос
/ 09 января 2012

wx.EVT_LIST_ITEM_DESELECTED будет срабатывать только тогда, когда пользователь изменяет выбранный объект в списке.Это служит той же цели, что и потеря фокуса на текстовом поле.Вызовите процедуры обновления из этого события.Чтобы пропустить последующий wx.EVT_KILL_FOCUS из текстового поля, установите атрибут «isDirty» в родительском объекте после обновления атрибутов.Вы можете проверить значение isDirty в любое время, чтобы подтвердить наличие изменений для фиксации.Этот атрибут должен быть сброшен при заполнении текстовых полей для нового выделения, а затем задан во время других событий текстового поля.

...