Como alterar o cursor posição de wxRichTextCtrl no manipulador de eventos?
Pergunta
Eu tenho um RichtextCtrl no meu aplicativo, que tem um manipulador para EVT_KEY_DOWN
. O código que é executado é o seguinte:
def move_caret(self):
pdb.set_trace()
self.rich.GetCaret().Move((0,0))
self.Refresh()
def onClick(self,event):
self.move_caret()
event.Skip()
rico é a minha RichtextCtrl.
Aqui está o que eu gostaria de fazer:
-
em cada tecla pressionada, adicione a chave para o controle (que é o comportamento padrão)
-
movimentar o cursor no início do controlo, primeira posição
Aqui está o que ele realmente faz:
-
acrescenta a chave para o controle
-
I inspecionados a posição do cursor, e os relatórios de depurador ele está localizado em 0,0, mas no controle, pisca na posição atual (que é a posição antes de pressionar uma tecla + 1)
Você vê nada de errado aqui? Deve haver algo que eu estou fazendo errado.
Solução
Aparentemente, há dois problemas com seu código:
-
Você ouve sobre
EVT_KEY_DOWN
, o que provavelmente é tratado antesEVT_TEXT
, cujo manipulador padrão define a posição do cursor. -
Você modificar o objeto
Caret
em vez de usar métodoSetInsertionPoint
, que ambos os movimentos do acento circunflexo e faz com que o próximo caractere aparecer em determinado lugar.
Assim, o exemplo de trabalho (eu testei e funciona como você gostaria que ele) seria:
# Somewhere in __init__:
self.rich.Bind(wx.EVT_TEXT, self.onClick)
def onClick(self, event):
self.rich.SetInsertionPoint(0) # No refresh necessary.
event.Skip()
Editar : se você deseja que o texto a ser adicionado no fim, mas o cursor para permanecer no início (ver comentários), você pode tirar vantagem do fato de que EVT_KEY_DOWN
é tratado antes EVT_TEXT
(que por sua vez é tratado após a adição de caracteres). Assim, a ordem dos eventos é:
- alça
EVT_KEY_DOWN
- caráter add no ponto de inserção atual
- alça
EVT_TEXT
Como adicionar um manipulador de EVT_KEY_DOWN
que move o ponto de inserção para o fim apenas antes de realmente adicionando o caráter faz o trabalho muito bem. Assim, além do código mencionado anteriormente, escreve:
# Somewhere in __init__:
self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)
def onKeyDown(self, event):
self.rich.SetInsertionPointEnd()
event.Skip()
A propósito, event.Skip()
não imediatamente invocar manipulador de eventos seguinte, justs define um sinalizador no objeto event
, de modo que o processador evento sabe se para parar a propagação do evento após esse manipulador.