0

この質問から来て、ラジオボタンの束を持つパネルで作られたカスタムポップアップを備えた wxComboCtrl があります。私の問題は、イベントがパネル自体によって処理されるため、ポップアップを開いたときにコンボがキーストロークを取得しないことです。 .. これらの KeyEvents をコンボの textctrl にリダイレクトしたいのですが、それを機能させる方法が見つかりません :/
間違った方向に進んでいますか? ユーザーがキーを押したときに textctrl 値を手動で処理する必要がありますか? 私はそれが少し面倒だと思います..おそらくtextctrlはすでにそれらのイベントを処理する方法を知っているので..

これが私のテストケース(Linux上のwxPython 2.8)です。「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()

編集:
同じトピックに関するこれらの (未解決の) ディスカッションを見つけまし

4

2 に答える 2

0

wxpython-users で Robin Dunn 自身から回答を得ました。

このように低レベルのイベントをネイティブ ウィジェットに送信することは、ほとんどの人が期待するようには機能しません。これにより、テキスト ctrl に文字が追加されることが予想されますが、ProcessEvent が行うことはバインドされたイベント ハンドラーに wx.Event を送信することだけであるため、それを行うことはできません。次のステップに進み、そのイベントを同等のネイティブ メッセージに変換してネイティブ ウィジェットに送信することはありません。「キーボード イベントのシミュレート」スレッドを参照してください。

Windows 以外のプラットフォームでは特にうまく機能しませんが、代わりに EmulateKeypress を呼び出してみてください。

于 2009-01-26T07:46:28.993 に答える