生産技術者サラリーマンの日々

社畜サラリーマンが生産技術やお金の悩みを徒然と書くブログです。私の備忘録が共有できるとうれしいです

【PYTHON+WATCH DOG】を使ったファイル更新通知GUI

設備が異常通知した時に、ユーザー側にするようなシステム作りたいなと思っていたところPYTHONWATCH DOGでファイル監視ができるようなので、勉強がてら作ってみました。

目次

1.仕様的なやつ

仕様はこんなかんじです。
①監視したいファイル先のURLを入力

URL入力
URL入力

②ファイル更新されるまでは待ちの状態

待ちの状態

③ファイル更新(Alarm.csvが更新されたらエラーとする)
※本当は、最上面にPOPUPしたかったのですが、実力不足で断念しました。

通知
2.プログラム

がっつりまねさせてもらいました。まとめが分かりやすくて
すぐに利用できます。
ファイル監視には、WATCH DOG、そして、それらを通知するGUIは、PySimpleを利用しました。

ファイル監視

ssrv.net

GUI(ユーザーインターフェースを作成)

www.simugrammer.com

from watchdog.events import PatternMatchingEventHandler
from watchdog.observers import Observer
import os
import time
import PySimpleGUI as sg
import datetime

alarm_on = 0

def on_modified(event):
	alarm_on=1

	filepath = event.src_path
	filename = os.path.basename(filepath)
	print('%s が更新されました!' % filename)
	dt = datetime.datetime.today() 
	
	if filename == 'Alarm.csv':
		window['-mytext-'].update('エラー発生 。゚(゚´Д`゚)゚。')
		window['-mytext2-'].update('%s' % dt)

if __name__ == "__main__":

	sg.theme('DarkAmber') 
	layout = [  [sg.Text('設備エラーファイル参照先を入力してください:')],
        	    [sg.Text(), sg.InputText('お好きなURLをデフォルトで入れてください')],
            	    [sg.Button('OK'), sg.Button('キャンセル')] ]
	window = sg.Window('エラーメッセンジャー', layout)


	while True:
		event, values = window.read()
		if event == sg.WIN_CLOSED or event == 'キャンセル':
			w_state  = 0
			break
		elif event == 'OK':
			w_state  = 1
			print('あなたが入力した値: ', values[0])
			break

	DIR_WATCH = values[0]
	PATTERNS = ['*.csv']
	window.close()


	sg.theme('DarkAmber') 
	layout = [  [sg.Text('エラー情報: '), sg.Text(size=(30,1), key='-mytext-')],
        	    [sg.Text('発生時刻: '), sg.Text(size=(30,1), key='-mytext2-')],
            	    [sg.Button('終了'), sg.Button('表示リセット'), sg.Button('非表示')] ]
	window = sg.Window('エラーメッセンジャー', layout)
	
	if w_state == 1:

		event_handler = PatternMatchingEventHandler(PATTERNS)
		event_handler.on_modified = on_modified
		observer = Observer()
		observer.schedule(event_handler, DIR_WATCH, recursive=True)
		observer.start()

		while True:
		
			event, values = window.read()

			if event == sg.WIN_CLOSED or event == '終了':
				observer.stop()
				break
			elif event == '表示リセット':
				window['-mytext-'].update('')
				window['-mytext2-'].update('')
				#window.normal()

			elif event == '非表示':
				window.minimize()
			
			elif alarm_on == 1:
				print('%s toota' % alarm_on)
				alarm_on = 0
				window.normal()

		observer.join()
	window.close()
https://blog.hatena.ne.jp/inusan0424/inusan0424.hatenablog.com/config/design/detail