Wie Cursorposition von wxRichTextCtrl in Event-Handler ändern?
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.
Lösung
Offenbar gibt es zwei Probleme mit Ihrem Code:
-
Sie hören auf
EVT_KEY_DOWN
, die wahrscheinlich vorEVT_TEXT
behandelt wird, deren Standard-Handler setzt die Cursorposition ein. -
Sie ändern das
Caret
Objekt anstelleSetInsertionPoint
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:
- handle
EVT_KEY_DOWN
- hinzufügen Zeichen an aktuellen Einfügemarke
- 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.