所以我有一个小脚本来监视文件的变化/修改,如果文件发生了变化,它会用它做一堆事情,比如:
class Event(LoggingEventHandler):
def dispatch(self, event):
#Do something here
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(message)s',
datefmt='%Y-%m-%d %H:%M:%S')
event_handler = Event()
observer = Observer()
observer.schedule(event_handler, my_path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()它工作得很好。但我有另一个脚本与一堆Tkinter窗口小部件(典型的tk应用程序与mainloop())。现在,当用户按下某个按钮时,我想调用watchdog来像以前一样监控文件的变化,并调用dispatch(),它对它做了一大堆工作,并在同一个脚本中更新了一些tkinter ui小部件,比如进度条。
对于这个图形用户界面的东西,我不太熟悉,不知道如何让watchdog循环和root.mainloop一起工作。怎么做呢?
发布于 2017-01-17 04:24:39
Watchdog在它自己的线程中运行,所以你不需要做太多的事情。如果要基于事件修改GUI,则应设置线程安全队列。Tkinter小部件不应该被多个线程修改,因此常见的模式是使用线程安全队列在线程之间进行通信。
下面的示例将看门狗事件放在队列上,并使用event_generate在检测到看门狗事件时将信号从观察者发送到图形用户界面。我不确定下面的方法是否在所有情况下都有效,因为目前我只能访问linux机器来测试它。然而,它似乎在linux上工作得很好。
import Tkinter as tk
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
from Queue import Queue
import sys
class CustomHandler(FileSystemEventHandler):
def __init__(self, app):
FileSystemEventHandler.__init__(self)
self.app = app
def on_created(self, event): app.notify(event)
def on_deleted(self, event): app.notify(event)
def on_modified(self, event): app.notify(event)
def on_moved(self, event): app.notify(event)
class App(object):
def __init__(self):
path = sys.argv[1] if len(sys.argv) > 1 else "/tmp"
handler = CustomHandler(self)
self.observer = Observer()
self.observer.schedule(handler, path, recursive=True)
self.queue = Queue()
self.root = tk.Tk()
self.text = tk.Text(self.root)
self.text.pack(fill="both", expand=True)
self.text.insert("end", "Watching %s...\n" % path)
self.root.bind("<Destroy>", self.shutdown)
self.root.bind("<<WatchdogEvent>>", self.handle_watchdog_event)
self.observer.start()
def handle_watchdog_event(self, event):
"""Called when watchdog posts an event"""
watchdog_event = self.queue.get()
print("event type:", type(watchdog_event))
self.text.insert("end", str(watchdog_event) + "\n")
def shutdown(self, event):
"""Perform safe shutdown when GUI has been destroyed"""
self.observer.stop()
self.observer.join()
def mainloop(self):
"""Start the GUI loop"""
self.root.mainloop()
def notify(self, event):
"""Forward events from watchdog to GUI"""
self.queue.put(event)
self.root.event_generate("<<WatchdogEvent>>", when="tail")
app = App()
app.mainloop()https://stackoverflow.com/questions/41682933
复制相似问题