Haciendo un wxPython TextCtrl responder a cr o ficha
Pregunta
Yo creo que esto debe ser una pregunta bastante básica, pero he buscado en Google a la muerte sin una respuesta clara, así que aquí va:Tengo un TextCtrl y quiero una bonita secuencia básica de eventos:1) El usuario mueve el foco al control, por las buenas o por las malas.2) El usuario escribe algo en el TextCtrl.3) El usuario pulsa retorno o ficha.4) En este punto, el código agarra el texto en el TextCtrl, hace algunos simples de procesamiento y, a continuación, mueve el foco a cualquier control es la siguiente en el orden de tabulación.
¿Alguien puede decirme cómo hacerlo?Parece tan básico para mí, pero no puedo encontrar la respuesta a cualquier lugar.Lo siento si me he perdido algo obvio.
Solución
Para conseguir que esto funcione correctamente, usted necesita para capturar los eventos clave y comprobar para ver si el usuario ha pulsado el Enter o Tab teclas.Como @sundar como ya se ha mencionado, para obtener la tabulación para que funcione correctamente en todas las plataformas, los controles deben ser hijos de un panel.He aquí un simple ejemplo:
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()
Aquí se unen a wx.EVT_KEY_DOWN
y tienen que extraer el código de la tecla que se presionó.A continuación, se comprueba si el código de la tecla es la Intro o la tecla Tab.Si es así, se llama a una función para procesar el texto y, a continuación, llama a event.EventObject.Navigate()
, que hará que wxPython para mover el foco al siguiente control en el orden de tabulación.
Es posible que desee leer lo siguiente sobre el tema:
- http://wxpython-users.1045709.n5.nabble.com/TextCtrl-processing-enter-key-td5075499.html
- http://www.wxpython.org/docs/api/wx.NavigationKeyEvent-class.html
Para obtener más información sobre wxPython la clave y char de eventos, consulte la siguiente:
Otros consejos
1. Para la pestaña para trabajar en absoluto, la ventana o el panel individual en el que los controles / wigits plonk tienen que tener como parte de su bandera de estilo lo siguiente: wxtab_traversal, es decir,
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.El orden de la pestaña se establece en el orden en que agrega controles al panel o marco.
3) El orden de pestañas también parece depender de los widgets de orden.Supongo que esto se debe a los números de identificación del widget.El orden de adición a los tamaños / paneles no pareció ayudarme.
4) Aquí hay un pequeño pedido de la pestaña de configuración de Demofor una vez que tenga los controles configurados:
order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
order[i+1].MoveAfterInTabOrder(order[i])