Изучение примера не кажется слишком трудным для объяснения, но я думаю, что TextCtrl в wxPython не так часто используется. Итак, вот оно: у меня есть простое окно с двумя TextCtrls. Один из них - входной виджет (пользователь должен вводить команды там), второй - выходной виджет (система отображает результат команд). Поле вывода представляет собой TextCtrl, доступный только для чтения, только в нем может записываться система.wxPython: перенаправление событий на другие виджеты (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()
Большое спасибо, это именно то, что мне нужно. Нужно было немного настроить его, чтобы он не интерпретировал стрелки или другие клавиши навигации, но теперь он отлично работает. –