微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将其他参数传递给FileSystemEventHandler类以允许用户输入?

如何解决如何将其他参数传递给FileSystemEventHandler类以允许用户输入?

我正在用python创建一个看门狗,用户可以在其中选择要监视的文件夹。为了使用选定的监视目录,我必须将变量传递到事件处理程序和调度程序中。我的结果如下。该程序首先要求目录,并避免使用任何全局变量

WATCHDOG.py

import time
import logging
import tkinter as tk
from tkinter import filedialog

from watchdog.observers import Observer
from watchdog.events import LoggingEventHandler,FileSystemEventHandler


class OnMyWatch:

    def __init__(self,dir):
        self.observer = Observer()
        self.dir = dir 

    def run(self):
        event_handler = Handler()
        self.observer.schedule(event_handler,self.dir,recursive = True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Observer Stopped")

        self.observer.join()



class Handler(FileSystemEventHandler):
    def __init__(self,dir): 
        self.dir = dir


if __name__ == "__main__":
    root = tk.Tk()
    root.withdraw()

    dir = filedialog.askdirectory()

    watch = OnMyWatch(dir)
    watch.run()

解决方法

我可能不明白您的问题。您说的想做就行。您的代码中的内容应该可以工作。您还可以使用类级别的变量,它实际上也是全局变量,但是在特定类的名称空间中。这段代码是一个更简单的示例,同时显示了两者:

SOME_GLOBAL_VARIABLE = "Some Global Variable"

class Handler():

    SOME_CLASS_LEVEL_VAR = "Some Class Level Var"

    @staticmethod
    def some_static_method(event):
        print(SOME_GLOBAL_VARIABLE)
        print(Handler.SOME_CLASS_LEVEL_VAR)

if __name__ == "__main__":
    Handler.some_static_method({})

结果:

Some Global Variable
Some Class Level Var

我在这里错过了重点吗?如果是我,对此感到抱歉。

,

直接的答案是,模块中的任何函数或方法都可以读取其全局变量而无需执行任何特殊操作。只要函数不使用变量名作为其参数列表或为变量分配值,它就不在函数名称空间中,并且python会在其他地方查找它(也许在类名称空间或模块名称空间中)。 / p>

更重要的是...

查看文档on_any_event并不是一个静态方法,并且在您的代码中将其设为静态不会带来任何好处。 FileSystemEventHandler旨在扩展您所需的事件处理信息。由于您希望目标目录在处理程序中可用,因此只需创建一个将其放置在其中的初始化程序即可。

我已经进行了一些重新排列,以将您的脚本级代码放入if __name__=="__main__":块中,并且我扩展了您的类,以将数据保留在GUI中。现在,您的观察者已与GUI及其创建的任何变量分离。您可以在不同的线程中运行多个观察者,并且可以根据需要用其他东西(例如测试脚本)替换GUI。

您可以将其他数据添加到类中,这只是使打印工作正常的最低要求。

import time
import logging 
import tkinter as tk
from tkinter import filedialog
from watchdog.observers import Observer 
from watchdog.events import LoggingEventHandler,FileSystemEventHandler

class OnMyWatch:

    def __init__(self,watch_dir,dest_dir):
        self.watch_dir = watch_dir
        self.dest_dir = dest_dir
        self.observer = Observer()

    def run(self):
        event_handler = Handler(self.dest_dir)
        self.observer.schedule(event_handler,self.watch_dir,recursive = True)
        self.observer.start()
        try:
            while True:
                time.sleep(5)
        except:
            self.observer.stop()
            print("Observer Stopped")

        self.observer.join()

class Handler(FileSystemEventHandler):

    def __init__(self,dest_dir): 
        self.dest_dir = dest_dir

    def on_any_event(self,event):
        print(self.dest_dir)

if __name__ == "__main__": 
    root = tk.Tk()
    root.withdraw()
    WATCH_DIRECTORY = filedialog.askdirectory()
    WATCH_DESTINATION = filedialog.askdirectory()
    watch = OnMyWatch(WATCH_DIRECTORY,WATCH_DESTINATION)
    watch.run()

注意:可以像使用小型脚本一样使用全局变量。上面的代码是为将来使用而编写的,但实际上,它是为简单脚本而过度设计的。有人认为您不应在代码中投入过多的内容,因为有关未来使用的预测通常是错误的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。