2009-01-21 11 views
0

En venant de this question, j'ai un wxComboCtrl avec une popup personnalisée faite d'un panneau avec un tas de boutons radio. Mon problème est que lorsque j'ouvre le popup le combo n'a pas de frappes , parce que les événements sont gérés par le panneau lui-même .. Je voudrais rediriger ces KeyEvents vers le textctrl du combo, mais je ne peux pas trouver un moyen de le faire fonctionner:/
Suis-je aller dans le mauvais sens ? Dois-je gérer manuellement la valeur textctrl lorsque l'utilisateur appuie sur les touches? Je pense que ce serait un peu lourd mais .. Comme le soi-disant textctrl sait déjà comment gérer ces événements ..Réception de touches dans un fichier wx.ComboCtrl ouvert

Voici mon testcase (wxPython 2.8 sur Linux), la méthode « on_key » devrait être le coupable:

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:
J'ai trouvé ces discussions (non résolues) sur le même sujet ..
"ComboCtrl loses keyboard focus when ComboPopup is shown "
"issue using wx.ComboCtrl"

Répondre

0

J'ai une réponse de Robin Dunn lui-même sur les utilisateurs wxPython-:

Envoi d'événements bas niveau à natifs widgets comme celui-ci ne fonctionne pas comme que la plupart des gens attendent à. Vous attendez ce pour aboutir à le caractère ajouté au texte ctrl, mais il ne peut pas le faire parce que tout que ProcessEvent n'est d'envoyer la wx.Event à tous les gestionnaires d'événements liés puis il arrête. Il ne va pas à l'étape suivante et convertir cet événement au message natif équivalent et l'envoyer sur le widget natif. Voir le fil "Simuler les événements du clavier" .

Cela ne fonctionne pas particulièrement bien sur les plates-formes non Windows , mais vous pouvez essayer d'appeler EmulateKeypress à la place.

+0

Robin Dunn est DA MAN! –