2016-09-30 4 views
0

Изучение примера не кажется слишком трудным для объяснения, но я думаю, что 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() 

ответ

1

Дать self.input.EmulateKeyPress(e) a. Если вы работаете в Windows, он должен работать нормально. На других платформах это не идеально, но в основном работает и там.

Другие варианты: использование wx.UiActionSimulator или просто добавление нового символа в текст ввода textctrl в коде.

+0

Большое спасибо, это именно то, что мне нужно. Нужно было немного настроить его, чтобы он не интерпретировал стрелки или другие клавиши навигации, но теперь он отлично работает. –

Смежные вопросы