Python WatchdogとPysimpleGUIと同時に使い、eventの対応は分かりません。

実現したいこと

1)GUIを立て開けて、Browseでフォルタを指定します。
2)指定したフォルタ中のファイルをモニタリングします。
3)中のファイルが新規、消す、更新などされたイベントは発生したら、GUIのWindowにそのイベントを表示します。
4)終了時に、ExitボタンでGUIを閉じます。

発生している問題・分からないこと

Exitボタンのイベントが効かないです。プログラムが終了できなくなります。

該当のソースコード

Python

1import time 2import PySimpleGUI as sg 3from watchdog.observers import Observer 4from watchdog.events import FileSystemEventHandler 5 6# Define an event handler class7class FolderEventHandler(FileSystemEventHandler):8 def __init__(self, sub_window):9 self.window = sub_window 10 11 def on_any_event(self, event):12 if event.is_directory:13 self.window.write_event_value('event', f"File {event.src_path} has been created")14 elif event.event_type == 'created':15 self.window.write_event_value('event', f"File {event.src_path} has been created")16 elif event.event_type == 'modified':17 self.window.write_event_value('event', f"File {event.src_path} has been modified")18 elif event.event_type == 'deleted':19 self.window.write_event_value('event', f"File {event.src_path} has been deleted")20 elif event.event_type == 'moved':21 self.window.write_event_value('event', f"File {event.src_path} has been moved")22 23# Create a GUI window to input the folder path24layout = [[sg.Text('Enter the folder path to monitor:')],25 [sg.Input(key="-FOLDER-"), sg.FolderBrowse(key="-Browse-")],26 [sg.Button('Start Monitoring'), sg.Button('Exit')],27 [sg.Output(size=(60, 10), key='-OUTPUT-')]]28 29window = sg.Window('File Monitoring', layout)30 31while True:32 event, values = window.read()33 if event in (sg.WINDOW_CLOSED, 'Exit'):34 break35 if event == 'Start Monitoring':36 folder_path = values["-FOLDER-"]37 if folder_path:38 window["-FOLDER-"].update(disabled=True)39 window["-Browse-"].update(disabled=True)40 observer = Observer()41 event_handler = FolderEventHandler(window)42 observer.schedule(event_handler, folder_path, recursive=True)43 observer.start()44 window['Start Monitoring'].update(disabled=True)45 window.Refresh()46 try:47 while True:48 event, values = window.read()49 if event in (sg.WINDOW_CLOSED, 'Exit'):50 break51 if event == 'event':52 print(values[event])53 54 except KeyboardInterrupt:55 observer.stop()56 57 observer.join()58 59window.close()

試したこと・調べたこと

上記の詳細・結果

class FolderEventHandler(FileSystemEventHandler):
def init(self, window):
self.window = window
上記のwindowを別名sub_windowを変わりましたが、効果はありませんでした。

補足

pythonの開発環境:Python3.8, Spyder

コメントを投稿

0 コメント