运行 python GTK3 TextView空闲时的方法

run a method when TextView is idle in python GTK3

考虑使用一个简单的 window 和 Gtk.textView

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

我希望在 txtView 空闲时(写入停止一段时间后,比如 5 秒)自动保存方法为 运行,但我不知道发生了什么事件) 使用。

向键释放事件添加一个回调,它将更新一个布尔标志,指示键盘上的键被按下,然后添加一个定期(定义为 5 秒)检查按键标志的超时函数,如果是,则自动保存。

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

编辑:

刚刚检查过您可能还想考虑鼠标复制粘贴。 Gtk.TextBuffer 有 改变的 信号。您可以对此使用相同的方法,例如。 on_textbuffer_changed 您设置标志,然后在 glib.timeout 您将保存。也许这是更好的方法,包括击键和鼠标事件。

另请注意,此解决方案将在 keystroke/textbuffer 更改 5 秒后保存。要做到这一点,只有在闲置 5 秒后,必须使用计时器,并且每次文本缓冲区更改时重置计时器,以便只有当计时器超过定义的空闲保存时间时,超时功能才会保存( timeout_add_seconds 定时回调的频率必须低于为空闲自动保存计时器选择的频率。