実現したいこと
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 class 7class 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 path 24layout = [[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 break 35 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 break 51 if event == 'event': 52 print(values[event]) 53 54 except KeyboardInterrupt: 55 observer.stop() 56 57 observer.join() 58 59window.close()
試したこと・調べたこと
- teratailやGoogle等で検索した
- ソースコードを自分なりに変更した
- 知人に聞いた
- その他
上記の詳細・結果
class FolderEventHandler(FileSystemEventHandler):
def init(self, window):
self.window = window
上記のwindowを別名sub_windowを変わりましたが、効果はありませんでした。
補足
pythonの開発環境:Python3.8, Spyder

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2024/01/07 12:37