Fare in modo che un TextCtrl wxPython risponda a cr o tab
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.
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:
- http://wxpython-users.1045709.n5.nabble.com/TextCtrl-processing-enter-key-td5075499.html
- http://www.wxpython.org/docs/api/wx.NavigationKeyEvent-class.html
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])
.