Видимо, есть две проблемы с вашим кодом:
Вы слушаете EVT_KEY_DOWN
, что, вероятно, обрабатывается до EVT_TEXT
, чей обработчик по умолчанию устанавливает позицию курсора.
Вы изменяете объект Caret
вместо использования метода SetInsertionPoint
, который перемещает курсор и заставляет следующий символ появляться в данном месте.
Таким образом, рабочий пример (я проверил его, и он работает так, как вам хотелось бы):
# Somewhere in __init__:
self.rich.Bind(wx.EVT_TEXT, self.onClick)
def onClick(self, event):
self.rich.SetInsertionPoint(0) # No refresh necessary.
event.Skip()
РЕДАКТИРОВАТЬ : если вы хотите, чтобы текст был добавлен в конце, но курсор оставался в начале (см. Комментарии), вы можете воспользоваться тем, что EVT_KEY_DOWN
обрабатывается перед EVT_TEXT
(который в свою очередь обрабатывается после добавления персонажа). Итак, порядок событий:
- ручка
EVT_KEY_DOWN
- добавить символ в текущей точке вставки
- ручка
EVT_TEXT
Добавление обработчика EVT_KEY_DOWN
, который перемещает точку вставки до конца непосредственно перед тем, как фактически добавить символ, делает работу довольно хорошо. Итак, в дополнение к упомянутому ранее коду, напишите:
# Somewhere in __init__:
self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
def onKeyDown(self, event):
self.rich.SetInsertionPointEnd()
event.Skip()
Кстати, event.Skip()
не сразу вызывает следующий обработчик событий, он просто устанавливает флаг в объекте event
, чтобы обработчик событий знал, стоит ли прекращать распространение события после этого обработчика.