使wxPython textcrll响应cr或tab

2024-05-13 16:46:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我想这一定是一个非常基本的问题,但是我在google上搜索到了死,没有一个明确的答案,所以这里是这样的:我有一个TextCtrl,我想要一个相当基本的事件序列:1)用户通过钩子或钩子将焦点移到控件上。2) 用户在textcrl中键入内容。3) 用户点击return或tab。4) 此时,代码获取textcrl中的文本,执行一些简单的处理,然后将焦点移动到制表顺序下一个控件上。在

有人能告诉我怎么做吗?在我看来这很基本,但我哪儿也找不到答案。抱歉,如果我错过了一些明显的东西。在


Tags: 答案代码用户内容键入returngoogle事件
2条回答

要使其正常工作,您需要捕获键事件并检查用户是否按了Enter或Tab键。正如前面提到的@sundar,要使tabbing在所有平台上都能正常工作,widget必须是面板的子控件。下面是一个相当简单的例子:

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,并让它提取被按下的键码。然后检查keycode是Enter键还是Tab键。如果是,它将调用一个函数来处理文本,然后调用event.EventObject.Navigate(),这将导致wxPython按制表符顺序将焦点移动到下一个小部件上。在

您可能需要阅读以下有关该主题的内容:

有关wxPython的key和char事件的详细信息,请参阅以下内容:

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)选项卡顺序似乎也依赖于小部件的创建顺序。我想这是由于widget ID号造成的。添加到尺寸机/面板的订单似乎对我没有帮助。在

4)以下是设置控件后设置选项卡顺序的小演示:

^{pr2}$

相关问题 更多 >