Как изменить положение курсора wxRichTextCtrl в обработчике событий?

StackOverflow https://stackoverflow.com/questions/622417

Вопрос

В моем приложении есть 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).

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

Это было полезно?

Решение

Судя по всему, в вашем коде есть две проблемы:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top