让wxPython TextCtrl对回车或标签键作出响应

4 投票
2 回答
4501 浏览
提问于 2025-04-18 15:43

我觉得这个问题应该很基础,但我在网上查了很多次都没有找到明确的答案,所以我来问问:我有一个文本框(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把焦点移动到下一个控件上。

你可能想看看以下关于这个主题的内容:

想了解更多关于wxPython的键盘和字符事件的信息,可以查看以下链接:

撰写回答