监视 python3 Gtk 应用程序中文件的更改
Monitor files for changes in a python3 Gtk application
我正在尝试监视目录,以便在 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。
有人知道我做错了什么吗?
我用下面的代码片段解决了我的问题,它基本上是相同的,但是有一个自定义 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()
但问题是,我完全不知道它为什么起作用,而前一个不起作用:)
仅通过阅读代码,我建议您的第一个代码失败,因为 add_monitor() 在函数退出时取消分配其所有变量,这与第二个将它们保留在对象中不同。尽管您可能出于同样的原因想要使用 self.gdir。但也许没有必要。
我正在尝试监视目录,以便在 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。
有人知道我做错了什么吗?
我用下面的代码片段解决了我的问题,它基本上是相同的,但是有一个自定义 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()
但问题是,我完全不知道它为什么起作用,而前一个不起作用:)
仅通过阅读代码,我建议您的第一个代码失败,因为 add_monitor() 在函数退出时取消分配其所有变量,这与第二个将它们保留在对象中不同。尽管您可能出于同样的原因想要使用 self.gdir。但也许没有必要。