Fügen Sie dem Schlüssel-Release-Ereignis einen Callback hinzu, der ein boolesches Flag aktualisiert, das anzeigt, dass die Taste auf der Tastatur gedrückt wurde, und eine Timeout-Funktion in regelmäßigen Intervallen (definiert als 5 Sekunden) hinzufügt, die das tastende Flag if prüft also dann autosave.
#!/usr/bin/python3
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class myWindow(Gtk.Window):
def __init__(self):
...
self.txtBuffer = Gtk.TextBuffer()
self.txtView = Gtk.TextView(buffer = self.txtBuffer)
#####################################################################
self.txtView.connect ("key-release-event", self.on_key_release_event)
GLib.timeout_add_seconds(5, self.check_autosave_timer)
#####################################################################
...
def autosave(self):
# code to save txtBuffer content to a file
def check_autosave_timer(self):
if self.keypressed:
self.autosave(self)
self.keypressed = False
return True
def on_key_release_event(self, event, user_data):
self.keypressed = True
EDIT:
So überprüft, dass Sie auch mit der Maus Copy-Paste betrachten möchten. Gtk.TextBuffer hat das geänderte Signal. Sie können den gleichen Ansatz verwenden, z. on_textbuffer_changed setzen Sie das Flag und dann auf glib.timeout, das Sie speichern würden. Vielleicht ist es ein besserer Ansatz und umfasst Tastenanschläge und Mausereignisse.
Beachten Sie auch, dass diese Lösung nach 5 Sekunden eines Tastendrucks/Textpufferspeichers gespeichert wird. Um dies zu tun, muss erst nach 5 Sekunden Leerlauf ein Timer verwendet werden, und jedes Mal, wenn sich der Textpuffer ändert, wird der Timer zurückgesetzt, so dass die Timeout - Funktion nur dann gespeichert wird, wenn der Timer länger als die definierte Zeit für das Speichern im Leerlauf läuft timeout_add_seconds Der zeitgesteuerte Rückruf muss auf eine niedrigere Frequenz eingestellt sein als die für den Leerlauf-Autosave-Timer gewählte Frequenz.
Haben Sie 'Glib.timeout_add()' berücksichtigt? Oder ein anderes Signal wie 'Focus-Out'? Ich glaube nicht, dass es ein Leerlaufsignal gibt. Sie müssen einen selbst erstellen. – theGtknerd
Möchten Sie mit der Maus kopieren-einfügen? –
yeah, ich habe versucht, 'GLib.timeout_add', aber es schien nur einmal zum ersten Mal ausgeführt zu werden, es stellt sich heraus, dass ich den' return True' -Teil vermisse, der 'Autosave'-Methode periodisch läuft. –