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.

Foi útil?

Solução

Aparentemente, há dois problemas com seu código:

  1. Você ouve sobre EVT_KEY_DOWN, o que provavelmente é tratado antes EVT_TEXT, cujo manipulador padrão define a posição do cursor.

  2. Você modificar o objeto Caret em vez de usar método SetInsertionPoint, 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 é:

  1. alça EVT_KEY_DOWN
  2. caráter add no ponto de inserção atual
  3. 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top