2017-05-31 5 views
1

im Leerlauf ist Betrachten mit einer Gtk.textViewführt eine Methode, wenn Textview in Python GTK3

#!/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) 
     ... 

    def autosave(self): 
     # code to save txtBuffer content to a file 

ich der automatischen Speicherung Methode ein einfaches Fenster mit ausgeführt werden soll, wenn txtView im Leerlauf ist (nach dem Schreiben für eine Zeitspanne gestoppt wird , sagen wir 5 Sekunden), aber ich weiß nicht, welche Ereignisse zu verwenden sind.

+1

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

+0

Möchten Sie mit der Maus kopieren-einfügen? –

+0

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. –

Antwort

1

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.

Verwandte Themen