Как изменить положение курсора wxRichTextCtrl в обработчике событий? - PullRequest
1 голос
/ 07 марта 2009

В моем приложении 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()

rich - это мой RichTextCtrl.

Вот что я хотел бы сделать:

  • при каждом нажатии клавиши добавить ключ к элементу управления (это поведение по умолчанию)

  • переместить курсор в начало элемента управления, первая позиция

Вот что на самом деле делает:

  • добавляет ключ к элементу управления

  • Я проверил положение каретки, и отладчик сообщает, что он расположен в 0,0, но на элементе управления он мигает в текущей позиции (то есть, до того, как я нажал клавишу + 1)

Вы видите что-то не так здесь? Должно быть, я что-то не так делаю.

1 Ответ

3 голосов
/ 08 марта 2009

Видимо, есть две проблемы с вашим кодом:

  1. Вы слушаете EVT_KEY_DOWN, что, вероятно, обрабатывается до EVT_TEXT, чей обработчик по умолчанию устанавливает позицию курсора.

  2. Вы изменяете объект 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 (который в свою очередь обрабатывается после добавления персонажа). Итак, порядок событий:

  1. ручка EVT_KEY_DOWN
  2. добавить символ в текущей точке вставки
  3. ручка 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, чтобы обработчик событий знал, стоит ли прекращать распространение события после этого обработчика.

...