案例研究似乎并不难解释,但我猜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()
答案 0 :(得分:1)
尝试self.input.EmulateKeyPress(e)
。如果您在Windows上,它应该可以正常工作。在其他平台上它并不完美,但基本上也在那里工作。
其他选项是使用wx.UiActionSimulator
,或者只是将新字符附加到代码中的输入textctrl。