2009-03-07 3 views
1

У меня есть RichTextCtrl в моем приложении, у которого есть обработчик для EVT_KEY_DOWN. Код, который выполняется следующая:Как изменить положение курсора wxRichTextCtrl в обработчике событий?


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, а на контроле, он мигает в текущем положении (что положение, прежде чем я нажал a ключ + 1)

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

+0

Что произойдет, если вы закомментируете событие.Skip() в onClick()? В качестве альтернативы я бы разместил небольшой рабочий образец в списке рассылки и давал этим экспертам возможность взглянуть на него. – DrBloodmoney

+0

Если я комментирую event.Skip(), символ не добавляется в элемент управления. – Geo

ответ

3

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

  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() 

EDIT: если вы хотите, чтобы текст, который будет добавлен в конце, но курсор остается в начале (см. комментарии), вы можете воспользоваться тем фактом, что 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() не сразу вызывать следующий обработчик события, он Justs устанавливает флаг в event объекта, так что процессор событий, знает ли остановить распространение события после этого обработчика.

+0

Я бы хотел, чтобы символ отображался нормально, а не в позиции 0. Я хотел бы переместить каретку в позицию 0 после. Можете ли вы показать мне, как это сделать? Я попытался поместить event.Skip в первую очередь и вызвать SetInsertionPoint после, но я получаю такое же поведение. – Geo

Смежные вопросы