Question

Je pense que ce doit être une jolie question de base, mais j'ai Googlé à la mort sans réponse claire, alors voilà:J'ai un TextCtrl et je veux une jolie séquence d'événements de base:1) L'utilisateur déplace le focus au contrôle par crochet ou par l'escroc.2) L'utilisateur tape quelque chose dans la TextCtrl.3) L'utilisateur appuie sur le retour ou l'onglet.4) a ce stade, le code attrape le texte dans la TextCtrl, est un simple traitement, puis déplace le focus à ce que le contrôle est le suivant dans l'ordre de tabulation.

Quelqu'un peut me dire comment faire cela?Il semble si fondamental pour moi, mais je ne trouve la réponse nulle part.Désolé si j'ai oublié quelque chose d'évident.

Était-ce utile?

La solution

Pour obtenir que cela fonctionne correctement, vous devrez attraper les principaux événements et les vérifier pour voir si l'utilisateur a appuyé sur Entrée ou les touches de Tabulation.Comme @sundar comme déjà mentionné, pour obtenir de tabulation pour travailler correctement sur toutes les plates-formes, les widgets doivent être les enfants d'un groupe spécial.Voici un très simple exemple:

import wx

########################################################################
class MyPanel(wx.Panel):
    """"""

    #----------------------------------------------------------------------
    def __init__(self, parent):
        """Constructor"""
        wx.Panel.__init__(self, parent)

        self.text = wx.TextCtrl(self, style=wx.TE_PROCESS_ENTER)
        self.text.Bind(wx.EVT_KEY_DOWN, self.onEnter)
        btn = wx.Button(self, label="Do something")
        self.text.SetFocus()

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.text, 0, wx.EXPAND|wx.ALL, 5)
        sizer.Add(btn, 0, wx.ALL|wx.CENTER, 5)
        self.SetSizer(sizer)

    #----------------------------------------------------------------------
    def onEnter(self, event):
        """"""
        keycode = event.GetKeyCode()
        if keycode == wx.WXK_RETURN or keycode == wx.WXK_NUMPAD_ENTER or keycode == wx.WXK_TAB:
            self.process_text(event=None)
            event.EventObject.Navigate()
        event.Skip()

    #----------------------------------------------------------------------
    def process_text(self, event):
        """
        Do something with the text
        """
        text = self.text.GetValue()
        print text.upper()
        for word in text.split():
            print word

########################################################################
class MyFrame(wx.Frame):
    """"""

    #----------------------------------------------------------------------
    def __init__(self):
        """Constructor"""
        wx.Frame.__init__(self, None, title="TextCtrl Demo")
        panel = MyPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

Ici, nous lier à wx.EVT_KEY_DOWN et de l'avoir extrait le code de touche qui a été pressée.Ensuite, il vérifie si le mot de code est l'Entrée ou la touche de Tabulation.Si elle l'est, elle appelle une fonction pour traiter le texte, puis il appelle event.EventObject.Navigate(), qui sera la cause de wxPython pour déplacer le focus vers le widget suivant dans l'ordre de tabulation.

Vous voudrez peut-être lire la suite sur le sujet:

Pour plus d'informations sur wxPython clés et char événements, consultez la rubrique suivante:

Autres conseils

1.Pour la tabulation pour fonctionner du tout, la fenêtre ou un panneau individuel que vous utilisez des commandes / wIGits plonk sur doit avoir dans le cadre de son drapeau de style: WXTAB_TRAVERSAL IE;

class MyPanel(wx.Panel):
    def __init__(self, parent,id):
        wx.Panel.__init__(self, parent, id, wx.DefaultPosition,wx.DefaultSize,
                         wx.RAISED_BORDER|wx.TAB_TRAVERSAL)

2.L'ordre des onglets est défini par la commande que vous ajoutez des commandes au panneau ou à la trame.

3) La commande de tabulation semble également être dépendante dans les widgets de commande sont créés.Je suppose que cela est dû aux numéros d'identification de widget.L'ordre d'addition de sizeurs / panneaux ne semblait pas m'aider avec.

4) Voici un petit paramètre de réglage Demofor une fois que vous avez la configuration des commandes:

order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
   order[i+1].MoveAfterInTabOrder(order[i])

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top