Domanda

Penso che questa sia una domanda piuttosto semplice, ma l'ho cercata su Google fino alla fine senza una risposta chiara, quindi ecco qui:Ho un TextCtrl e voglio una sequenza di eventi piuttosto semplice:1) L'utente sposta il focus sul controllo in un modo o nell'altro.2) L'utente digita qualcosa nel TextCtrl.3) L'utente preme Invio o Tab.4) A questo punto, il codice cattura il testo in TextCtrl, esegue alcune semplici elaborazioni e quindi sposta lo stato attivo su qualunque controllo sia successivo nell'ordine di tabulazione.

Qualcuno può dirmi come farlo?Mi sembra banale, ma non riesco a trovare la risposta da nessuna parte.Scusate se mi sono perso qualcosa di ovvio.

È stato utile?

Soluzione

Per farlo funzionare correttamente, dovrai catturare gli eventi chiave e verificare se l'utente ha premuto i tasti Invio o Tab.Come @sundar come già accennato, affinché le schede funzionino correttamente su tutte le piattaforme, i widget devono essere figli di un pannello.Ecco un esempio abbastanza semplice:

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()

Qui ci leghiamo a wx.EVT_KEY_DOWN e fagli estrarre il codice chiave che è stato premuto.Quindi controlla se il codice chiave è il tasto Invio o Tab.Se lo è, chiama una funzione per elaborare il testo e poi chiama event.EventObject.Navigate(), che farà sì che wxPython sposti il ​​focus sul widget successivo nell'ordine delle schede.

Potresti voler leggere quanto segue su questo argomento:

Per ulteriori informazioni sugli eventi chiave e char di wxPython, vedere quanto segue:

Altri suggerimenti

1.Per la linguzione per lavorare affatto, la finestra o il pannello individuale di cui i controlli / wigit di Plonk si devono avere come parte del suo flag di stile quanto segue: 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'ordine di tabulazione è impostato dall'ordine aggiungi controlli al pannello o al telaio.

3) L'ordine di linguetta sembra anche dipendere dai widget dell'ordine vengono creati.Suppongo che questo sia dovuto ai numeri ID widget.L'ordine di aggiunta ai sizers / pannelli non sembrava aiutarmi con.

4) Ecco un piccolo demobile impostazione dell'ordine Tab Ordine dopo aver impostato i controlli:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top