让wxPython TextCtrl对回车或标签键作出响应
我觉得这个问题应该很基础,但我在网上查了很多次都没有找到明确的答案,所以我来问问:我有一个文本框(TextCtrl),我想实现一个简单的操作流程:1)用户通过某种方式把焦点移到这个文本框上。2)用户在文本框里输入一些内容。3)用户按下回车键或者Tab键。4)在这个时候,代码会获取文本框里的内容,进行一些简单的处理,然后把焦点移到下一个可以操作的控件上。
有没有人能告诉我该怎么做?对我来说这看起来很简单,但我就是找不到答案。如果我漏掉了什么明显的东西,真是抱歉。
2 个回答
1
1. 要让标签键(Tab键)能正常工作,你放置控件的窗口或面板必须在样式中包含一个标志:wxTAB_TRAVERSAL。也就是说,得设置这个选项。
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. 标签的顺序是根据你添加控件的顺序来决定的。
3. 标签的顺序似乎还和控件创建的顺序有关。我猜这是因为控件有自己的ID编号。把控件添加到布局或面板的顺序似乎对我没有帮助。
4. 下面是一个小示例,展示了在设置好控件后如何设置标签顺序:
order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
order[i+1].MoveAfterInTabOrder(order[i])
4
要让这个功能正常工作,你需要捕捉键盘事件,并检查用户是否按下了回车键或Tab键。正如@sundar已经提到的,为了让Tab键在所有平台上都能正常工作,这些控件需要放在一个面板里面。下面是一个相对简单的例子:
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()
在这里,我们绑定了 wx.EVT_KEY_DOWN
事件,并提取出被按下的键码。然后,它会检查这个键码是否是回车键或Tab键。如果是的话,就会调用一个函数来处理文本,然后调用 event.EventObject.Navigate()
,这会让wxPython把焦点移动到下一个控件上。
你可能想看看以下关于这个主题的内容:
- http://wxpython-users.1045709.n5.nabble.com/TextCtrl-processing-enter-key-td5075499.html
- http://www.wxpython.org/docs/api/wx.NavigationKeyEvent-class.html
想了解更多关于wxPython的键盘和字符事件的信息,可以查看以下链接: