wxPython:重定向其他小部件上的事件(TextCtrl)

时间:2016-09-30 03:12:16

标签: python events widget wxpython textctrl

案例研究似乎并不难解释,但我猜wxPython中的TextCtrl并不经常以这种方式使用。所以这就是:我有一个带有两个TextCtrls的简单窗口。一个是输入小部件(用户应该在那里输入命令),第二个是输出小部件(系统显示命令的结果)。输出字段是只读的TextCtrl,只有系统才能写入。

到目前为止一切顺利。现在,我想拦截输出窗口小部件中的事件:如果用户键入此输出字段(只读窗口小部件),则应将它们重定向到输入字段,并且它们已开始键入的文本应显示在那里。第一部分并不复杂:我拦截了输出小部件上的EVT_KEY_DOWN,可以执行类似self.input.SetFocus()的操作。但是,用户按下的键丢失了。如果他/她开始打字,她必须重新开始。这应该是一个快捷方式的功能(无论用户类型在哪个字段中,都应该在输入小部件中写入)。

关于我为什么这样做的简短说明,因为它仍然非常愚蠢:有视力的用户通常不会使用只读小部件;他们看到了他们,让他们独自一人。此应用程序主要是为具有屏幕阅读器的用户设计的,他们必须在输出字段中移动。因此光标通常在那里,按键没有任何效果(因为它是一个只读的小部件)。如果在输入小部件中输入用户被重定向到输入字段,并且他在此小部件中已经输入了文本,那将是很棒的。

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent):
        wx.Frame.__init__(self, parent)
        self.panel = MyPanel(self)
        self.Show()
        self.Maximize()

class MyPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        sizer = wx.BoxSizer(wx.VERTICAL)
        self.SetSizer(sizer)

        # Input field
        self.input = wx.TextCtrl(self, -1, "", size=(125, -5),
                style=wx.TE_PROCESS_ENTER)

        # Ouput
        self.output = wx.TextCtrl(self, -1, "",
                size=(600, 400), style=wx.TE_MULTILINE|wx.TE_READONLY)

        # Add the output fields in the sizer
        sizer.Add(self.input)
        sizer.Add(self.output, proportion=8)

        # Event handler
        self.output.Bind(wx.EVT_KEY_DOWN, self.OnKeyDown)

    def OnKeyDown(self, e):
        """A key is pressed in the output widget."""
        modifiers = e.GetModifiers()
        key = e.GetUnicodeKey()
        if not key:
            key = e.GetKeyCode()

        print "From there, we should redirect to the input"
        self.input.SetFocus()

# Let's run that
app = wx.App()
MyFrame(None)
app.MainLoop()

1 个答案:

答案 0 :(得分:1)

尝试self.input.EmulateKeyPress(e)。如果您在Windows上,它应该可以正常工作。在其他平台上它并不完美,但基本上也在那里工作。

其他选项是使用wx.UiActionSimulator,或者只是将新字符附加到代码中的输入textctrl。