在 python3 Gtk 应用程序中监视文件的变化

时间:2021-04-04 06:16:10

标签: python-3.x gtk gio

我正在尝试监视一个目录,以便在 Gtk 应用程序中检测文件何时添加到其中并采取措施。

我编写了以下 Gio / Gtk 代码段来进行实验,但如果我创建了一个类似 echo tata > tutu 的文件或者我移动了一个文件,例如 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()

如果重要的话,我在 debian 11(bullseye)上使用 python3.7,python3-gi 包版本是 3.30.4-1。

有人知道我做错了什么吗?

2 个答案:

答案 0 :(得分:0)

我使用以下基本相同的代码段解决了我的问题,但使用自定义类,继承 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()

但问题是,我完全不知道为什么它有效而前一个无效:)

答案 1 :(得分:0)

仅通过阅读代码,我建议您的第一个代码失败,因为 add_monitor() 在函数退出时取消分配其所有变量,而第二个将它们保留在对象中。尽管出于同样的原因,您可能想使用 self.gdir。但也许没有必要。