使wxPython TextCtrl响应cr或tab



我认为这一定是一个非常基本的问题,但我已经在谷歌上搜索过了,没有明确的答案,所以这里是:我有一个TextCtrl,我想要一个非常基本的事件序列:1)用户通过各种方法将焦点移动到控件上。2)用户在TextCtrl中输入一些东西。3)用户按回车键或tab键。4)此时,代码捕获TextCtrl中的文本,进行一些简单的处理,然后将焦点移动到选项卡顺序中的下一个控件上。

谁能告诉我怎么做这个?这对我来说似乎很基本,但我在任何地方都找不到答案。如果我错过了一些明显的东西,我很抱歉。

要使其正常工作,您需要捕获键事件并检查用户是否按下了Enter或Tab键。正如@sundar已经提到的,为了让选项卡在所有平台上都能正常工作,小部件需要是面板的子组件。下面是一个相当简单的例子:

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,并让它提取按下的键码。然后检查键码是Enter还是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的键和char事件的更多信息,请参见以下内容:

  • http://www.wxpython.org/docs/api/wx.KeyEvent-class.html
  • http://www.blog.pythonlibrary.org/2009/08/29/wxpython-catching-key-and-char-events/

1。为了使选项卡工作,您放置控件/按钮的窗口或单个面板必须具有以下样式标志的一部分: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。选项卡的顺序是根据您向面板或框架添加控件的顺序来设置的。

3)选项卡顺序似乎也依赖于小部件创建的顺序。我认为这是由于小部件ID号。添加尺寸/面板的顺序似乎对我没有帮助。

设置好控件后,这里有一个设置选项卡顺序的小示例:
order = (control1, control2, control3, ...)
for i in xrange(len(order) - 1):
   order[i+1].MoveAfterInTabOrder(order[i])

相关内容

  • 没有找到相关文章

最新更新