Я подозреваю, что вы заявляете, что ваш TextCtrl
соответствует стилю wx.TE_PROCESS_ENTER
, а затем привязываете событие EVT_TEXT_ENTER
- только потому, что я столкнулся с той же проблемой, когда пытался это сделать.должен был написать метод для обработки wx.EVT_TEXT_ENTER
, который бы затем использовал метод TextCtrl:Remove()
.Этот метод, кажется, только удаляет видимые символы, к сожалению.Моей следующей мыслью было использование метода EmulateKeyPress()
вместе с backspace (WKX_BACK
) для удаления символа новой строки.Это может быть выполнимо, хотя я не смог придумать хороший способ подделать wx.KeyEvent
(не могу просто использовать event.m_keyCode
, поскольку EVT_TEXT_ENTER
отправляет CommandEvent
, а не KeyEvent
), поэтому я дална этом подходе ... эээ, я имею в виду, что это решение оставлено читателю в качестве упражнения.
wx.EVT_TEXT_ENTER
будучи CommandEvent
, наконец, привело к третьему углу, который сработал.Вместо привязки wx.EVT_TEXT_ENTER
я связал wx.EVT_CHAR
и ввел в логику специальную обработку для ключа Return
(код ключа ASCII 13).Затем я планировал реализовать бит EmulateKeyPress()
, о котором я говорил ранее, но когда я удалил wx.TE_PROCESS_ENTER
из стиля TextCtrl, я обнаружил, что \n
больше не был незаметно добавлен.Код следующий:
import wx
class TestRun(wx.Frame):
def __init__(self,parent):
wx.Frame.__init__(self, parent, title="StackO Test", size=(400,400))
self.control = wx.TextCtrl(self, id=wx.ID_ANY, style=wx.TE_MULTILINE)
self.control.Bind(wx.EVT_CHAR, self.OnPress)
self.Show(True)
def OnPress(self, event):
if event.GetKeyCode() == 13:
self.control.WriteText('\n>>>')
else:
event.Skip()
if __name__ == '__main__':
app = wx.App(False)
TestRun(None)
app.MainLoop()
Линия event.Skip()
имеет решающее значение;во время моего исследования я узнал, что за KeyEvent
обычно следует CharEvent
.CharEvent
- это часть, где символ записывается в TextCtrl
.Когда вы перехватываете KeyEvent
, CharEvent
вызывается, только если вы делаете это явно - event.skip()
жизненно важно, если вы хотите, чтобы ваш TextCtrl
в противном случае вел себя как обычно.Без него любой ввод с клавиатуры, не равный ASCII-коду 13, ничего бы не сделал.
Из моих тестов оказалось, что есть что-то в объявлении TextCtrl
в стиле wx.TE_PROCESS_ENTER
, который заставляет его печатать новую строкупосле каждого звонка WriteText()
.Мой путь обходит это, хотя у вас будет больше работы, чтобы убедиться, что точка вставки всегда находится в нужном месте и т. Д.
Удачи!