Событие кнопки ввода wxPython

Я видел много информации по этой теме, но точно не ответил на этот вопрос. У меня проблема противоположная большинству. Я хочу, чтобы кнопка «Ввод» не нажимала кнопку, когда кнопка имеет фокус. И для этого я не хочу просто отключить кнопку от принятия нажатия кнопки Enter, а скорее хочу условно зафиксировать нажатие кнопки Enter в методе обратного вызова. Прямо сейчас я привязал следующее событие ко всем виджетам в моей программе на Python:

parent.Bind(wx.EVT_CHAR, self.CharInputCallback)

Событие EVT_CHAR фактически вызывается при нажатии кнопки ввода, и я могу получить обратный вызов в своем методе обратного вызова. Моя проблема заключается в том, что функциональность кнопки ввода, состоящая в виртуальном нажатии кнопки, по-прежнему выполняется, несмотря на то, что намеренно не пропускается событие (которое будет пересылаться по событию). Поскольку это происходит, и я уверен, что мой метод обратного вызова не перенаправляет событие (я проверял это, перехватывая символы, идущие в текстовое поле), я подозреваю, что кнопка ввода вызывает дополнительное событие, которое я не фиксирую . Я попытался связать и зафиксировать дополнительные следующие события, чтобы предотвратить «виртуальный щелчок» от кнопки ввода:

parent.Bind(wx.EVT_TEXT_ENTER, self.CharInputCallback)
parent.Bind(wx.EVT_KEY_UP, self.CharInputCallback)
parent.Bind(wx.EVT_KEY_DOWN, self.CharInputCallback)

Тем не менее, когда я нажимаю ввод, кнопка в фокусе все еще нажимается. Подводя итог, возникает ли дополнительное событие, когда я нажимаю кнопку ввода? Если да, то какое событие, в частности, «фактически щелкает» по кнопке? На большинстве форумов, которые я нашел, обсуждалось, как распознать нажатие кнопки ввода, но я хочу распознать ее и отключить действие по умолчанию, когда кнопка находится в фокусе.


person user1777820    schedule 19.11.2012    source источник


Ответы (2)


Я попытался привязать все эти события к разным обработчикам, а также привязал EVT_BUTTON. Похоже, что EVT_BUTTON всегда срабатывает ДО того, как сработают события key и char. Если вы не хотите, чтобы ваша кнопка нажималась, вам, вероятно, придется либо отключить ее, либо использовать другой виджет (возможно, одну из общих кнопок), либо создать свой собственный. Я бы также спросил в списке рассылки wxPython, чтобы узнать, есть ли у них какие-либо предложения.

Единственный известный мне способ упорядочить события в wxPython — использовать wx.CallAfter или wx.CallLater. Я не уверен, как бы вы использовали это в этом контексте.

person Mike Driscoll    schedule 20.11.2012
comment
Я обнаружил, что событие нажатия клавиши было тем, которое вызвало нажатие кнопки. Или в конечном итоге привело к нажатию кнопки. Захватив и не пропустив событие нажатия клавиши, я смог предотвратить нажатие кнопки ввода на кнопки в фокусе. Интересно, что у меня были некоторые проблемы при связывании всех моих ранее упомянутых событий. В настоящее время я фиксирую события EVT_CHAR и KEY_UP. Кажется, это помогает. - person user1777820; 20.11.2012
comment
Хм. Странный. Я не заметил такого поведения в Windows 7. В любом случае, я рад, что вы поняли это. - person Mike Driscoll; 20.11.2012

Событие, которое заставляет ввод нажать кнопку, является событием нажатия клавиши. Мой код для моего обратного вызова был немного испорчен. Захват события нажатия клавиши и его непропуск предотвращает нажатие кнопки ввода на кнопку в фокусе. Во всяком случае, на Windows 7.

person user1777820    schedule 20.11.2012