python-3.xgtkgio

Monitor files for changes in a python3 Gtk application


I'm trying to monitor a directory, in order to detect when files are added to it and take action, in a Gtk application.

I've written the following Gio / Gtk snippet to experiment that, but no event get detected, if I create a file with something like echo tata > tutu or if I move a file, like mv tutu plop:

#!/usr/bin/env python3

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk

def directory_changed(monitor, f1, f2, evt):
    print("Changed:", f1, f2, evt)

def add_monitor(directory):
    gdir = Gio.File.new_for_path(directory)
    monitor = gdir.monitor_directory(Gio.FileMonitorFlags.NONE, None)
    monitor.connect("changed", directory_changed)

win = Gtk.Window()
win.connect("destroy", Gtk.main_quit)
add_monitor('.')

win.show_all()
Gtk.main()

If it matters, I'm using python3.7 on debian 11 (bullseye) and the python3-gi package version is 3.30.4-1.

Does anyone have an idea of what I'm doing wrong?


Solution


I solved my problem with the following snippet which is basically the same, but with a custom class, subclassing Gtk.Window:

#!/usr/bin/env python3

import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gio, Gtk

class DocCliWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self, title = "Document to clipboard")

    def on_directory_changed(self, monitor, f1, f2, evt):
        print("Changed", f1, f2, evt)

    def add_monitor(self, directory):
        gdir = Gio.File.new_for_path(directory)
        self.monitor = gdir.monitor_directory(Gio.FileMonitorFlags.NONE, None)
        self.monitor.connect("changed", self.on_directory_changed)

win = DocCliWindow()
win.connect("destroy", Gtk.main_quit)
win.add_monitor('.')

win.show_all()
Gtk.main()

But the problem is, I have absolutely no idea of why it works and the previous one doesn't :)