Получение нажатий клавиш в открытом wx.ComboCtrl - PullRequest
0 голосов
/ 21 января 2009

Исходя из этого вопроса , у меня есть wxComboCtrl с пользовательским всплывающим окном, сделанным из панели с кучей радиокнопок. Моя проблема в том, что когда я открываю всплывающее окно, комбо не получает нажатия клавиш, потому что события обрабатываются самой панелью .. Я бы хотел перенаправить эти KeyEvents в textctrl комбо, но я не могу найти способ заставить его работать: /
Я иду неправильным путем? Должен ли я вручную обрабатывать значение textctrl, когда пользователь нажимает клавиши? Я думаю, что это было бы немного громоздко, хотя ... Так как предположительно textctrl уже знает, как обрабатывать эти события ..

Вот мой тестовый пример (wxPython 2.8 в Linux), виновником должен быть метод "on_key":

import wx
import wx.combo

class CustomPopup(wx.combo.ComboPopup):

    def Create(self, parent):
        # Create the popup with a bunch of radiobuttons
        self.panel = wx.Panel(parent)
        sizer = wx.GridSizer(cols=2)
        for x in range(10):
            r = wx.RadioButton(self.panel, label="Element "+str(x))
            r.Bind(wx.EVT_RADIOBUTTON, self.on_selection)
            sizer.Add(r)
        self.panel.SetSizer(sizer)

        # Handle keyevents
        self.panel.Bind(wx.EVT_KEY_UP, self.on_key)

    def GetControl(self):
        return self.panel

    def GetAdjustedSize(self, minWidth, prefHeight, maxHeight):
        return wx.Size(200, 150)

    def on_key(self, evt):
        if evt.GetEventObject() is self.panel:
            # Trying to redirect the key event to the combo.. But this always returns false :(
            print self.GetCombo().GetTextCtrl().GetEventHandler().ProcessEvent(evt)
        evt.Skip()

    def on_selection(self, evt):
        self.Dismiss()
        wx.MessageBox("Selection made")


class CustomFrame(wx.Frame):

    def __init__(self):
        # Toolbar-shaped frame with a ComboCtrl
        wx.Frame.__init__(self, None, -1, "Test", size=(800,50))
        combo = wx.combo.ComboCtrl(self)
        popup = CustomPopup()
        combo.SetPopupControl(popup)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(combo, 0)
        self.SetSizer(sizer)
        self.Layout()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    CustomFrame().Show()
    app.MainLoop()

Edit:
Я нашел эти (неразрешенные) обсуждения на ту же тему ..
«ComboCtrl теряет фокус клавиатуры, когда отображается ComboPopup»
"проблема с использованием wx.ComboCtrl"

1 Ответ

0 голосов
/ 26 января 2009

Я получил ответ от самого Робина Данна о пользователях wxpython:

Отправка низкоуровневых событий на нативный такие виджеты не работают так, что большинство людей ожидают этого. Вы ожидаете, что это приведет к символ, добавляемый к тексту Ctrl, но он не может этого сделать, потому что все что ProcessEvent отправляет wx.Event для любых связанных обработчиков событий и тогда это останавливается. Это не идет в следующий шаг и преобразовать это событие к эквивалентному нативному сообщению и отправить его на родной виджет. Увидеть «Имитация событий клавиатуры» нить.

Это не особенно хорошо работает на не Windows платформы, но вы могли бы попробуйте вместо этого вызвать EmulateKeypress.

...