Frage

Ich habe eine RichTextCtrl in meiner Anwendung, die einen Handler für EVT_KEY_DOWN hat. Der Code, der ausgeführt wird, ist die folgende:


def move_caret(self):
    pdb.set_trace()
    self.rich.GetCaret().Move((0,0))
    self.Refresh()


def onClick(self,event):
    self.move_caret()
    event.Skip()

reich ist mein RichTextCtrl.

Hier ist, was ich tun möchte:

  • auf jeder Taste drücken, fügen Sie den Schlüssel für die Steuerung (das Standardverhalten ist)

  • , um den Cursor an den Anfang der Steuerung ersten Position

  • Verschieben

Hier ist, was es tatsächlich tut:

  • fügt den Schlüssel zur Kontrolle

  • ich die Position der Einfügemarke inspizierte, und der Debugger meldet er bei 0,0, sondern auf der Steuer gelegen ist, blinkt es an der aktuellen Position (die Position, bevor ich eine Taste gedrückt + 1)

Sehen Sie hier irgendetwas nicht in Ordnung? Es muss etwas ich falsch mache.

War es hilfreich?

Lösung

Offenbar gibt es zwei Probleme mit Ihrem Code:

  1. Sie hören auf EVT_KEY_DOWN, die wahrscheinlich vor EVT_TEXT behandelt wird, deren Standard-Handler setzt die Cursorposition ein.

  2. Sie ändern das Caret Objekt anstelle SetInsertionPoint Methode zu verwenden, die sowohl die Cursor bewegt und macht das nächste Zeichen in bestimmten Stelle erscheinen.

So Arbeitsbeispiel (I getestet und es funktioniert, wie Sie es möchten) wäre:

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_TEXT, self.onClick)

def onClick(self, event):
    self.rich.SetInsertionPoint(0) # No refresh necessary.
    event.Skip()

Bearbeiten : Wenn Sie den Text wollen am Ende hinzugefügt werden, aber die Cursor am Anfang (siehe Kommentare) bleiben, können Sie die Vorteile aus der Tatsache ziehen, dass EVT_KEY_DOWN vor EVT_TEXT behandelt wird (der wiederum nach dem Charakter zusätzlich behandelt werden). So ist die Reihenfolge der Ereignisse ist:

  1. handle EVT_KEY_DOWN
  2. hinzufügen Zeichen an aktuellen Einfügemarke
  3. handle EVT_TEXT

einen Handler von EVT_KEY_DOWN fügt hinzu, dass der Einfügemarke gerade zu Ende geht, bevor das Zeichen tatsächlich das Hinzufügen ganz gut macht die Arbeit. So, zusätzlich zu dem Code bereits erwähnt, schreiben:

# Somewhere in __init__:
    self.rich.Bind(wx.EVT_KEY_DOWN, self.onKeyDown)

def onKeyDown(self, event):
    self.rich.SetInsertionPointEnd()
    event.Skip()

Durch die Art und Weise, wird event.Skip() nicht unmittelbar neben Event-Handler aufrufen, es justs ein Flag im event Objekt, so dass Ereignisprozessor weiß, ob das Ereignis nach diesem Handler zu stoppen ausbreiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top