teratail header banner
teratail header banner
質問するログイン新規登録

質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

266閲覧

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

Deng

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2024/01/06 06:42

編集2024/01/06 07:13

0

0

実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

質問のコードは、Start Monitoringボタンをクリックした後Exitをクリックすると、すぐにobserver.join()が呼ばれます。
join()が呼ばれると、メインスレッドが(observer内で生成済の)監視用スレッドの終了を待ち受ける状態になりますが、監視用スレッドは実行され続けるため、GUIが反応しなくなってしまっていると推測します。

正常に動作させるには、observer.join()の前にobserver.stop()を呼ぶ必要があります。

また、whileのループが二重になっていますが、ここは二重にする必要はありません。

py

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 31 32while True: 33 event, values = window.read() 34 if event in (sg.WINDOW_CLOSED, 'Exit'): 35 break 36 if event == 'Start Monitoring': 37 folder_path = values["-FOLDER-"] 38 if folder_path: 39 window["-FOLDER-"].update(disabled=True) 40 window["-Browse-"].update(disabled=True) 41 observer = Observer() 42 event_handler = FolderEventHandler(window) 43 observer.schedule(event_handler, folder_path, recursive=True) 44 observer.start() 45 window['Start Monitoring'].update(disabled=True) 46 window.Refresh() 47 if event == 'event': 48 print(values[event]) 49 50observer.stop() 51observer.join() 52window.close()

投稿2024/01/07 06:03

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Deng

2024/01/07 12:37

SaYAO 様 大変助かりました。ありがとうございました。勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問