Как изменить положение курсора wxRichTextCtrl в обработчике событий?
Вопрос
В моем приложении есть RichTextCtrl, у которого есть обработчик для EVT_KEY_DOWN
.Код, который выполняется, следующий:
def move_caret(self):
pdb.set_trace()
self.rich.GetCaret().Move((0,0))
self.Refresh()
def onClick(self,event):
self.move_caret()
event.Skip()
богатый это мой RichTextCtrl.
Вот что я хотел бы сделать:
при каждом нажатии клавиши добавляйте клавишу в элемент управления (это поведение по умолчанию)
переместите курсор в начало элемента управления, первая позиция
Вот что это на самом деле делает:
он добавляет ключ к элементу управления
Я проверил положение курсора, и отладчик сообщает, что он расположен в 0,0, но на элементе управления он мигает в текущей позиции (которая была до того, как я нажал клавишу + 1).
Вы видите здесь что-то неправильное?Должно быть, я что-то делаю неправильно.
Решение
Судя по всему, в вашем коде есть две проблемы:
Вы слушаете
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
объект, чтобы обработчик событий знал, следует ли прекратить распространение события после этого обработчика.