Pythonで簡単なウィジェット作ってみた
こんにちは。
宇宙よりも遠い場所に憧れる
21歳のしがない大学生です。
暇つぶし、息抜きにこんなの作りました。
言語はみんな大好きPython3です。
個人的には気に入ってます。
というか
我ながら良い物が出来たなぁと。
しみじみ。
_人人人人人人_
> 手前味噌 <
 ̄Y^Y^Y^Y^Y ̄
ちなみに
表示されている情報をクリックすると
その情報のソースに飛びます。
今「平常運転」と出ているところは
[平常運転,遅延,運転見合わせ,交通障害,運行情報あり,接続エラー,情報取得中]
の7種類の表示に対応させています。
こういう時に限って遅延しない中央線はナンバリングを「KY」に変えた方が良い。
ちなみに、ちゃんと(?)
接続エラーにも対応しています。
ソースコード(一部)
#-----012_予測雨雲レーダー画像ダウンロード----- class PredictiveRadarDownload(threading.Thread): def __init__(self): super(PredictiveRadarDownload, self).__init__() self.stop_event = threading.Event() self.setDaemon(True) #msg self.icon_msg = cv2.imread(WeatherPath + "radar/predictive_radar_msg.jpg") self.legend = cv2.imread(WeatherPath + "radar/legend.jpg") #デフォルト値 self.radar_code = "3/16/" self.radar_area_code = "3/" self.radar_hour = "-" self.radar_minute = "-" self.expansion = [] self.exp60 = cv2.imread(WeatherPath + "radar/movement_loading.jpg") self.exp120 = self.exp60 self.exp180 = self.exp60 self.exp240 = self.exp60 self.exp300 = self.exp60 self.exp360 = self.exp60 self.expansion.extend([self.exp60,self.exp120,self.exp180, self.exp240,self.exp300,self.exp360]) self.wide = [] self.wide60 = self.exp60 self.wide120 = self.exp60 self.wide180 = self.exp60 self.wide240 = self.exp60 self.wide300 = self.exp60 self.wide360 = self.exp60 self.wide.extend([self.wide60,self.wide120,self.wide180, self.wide240,self.wide300,self.wide360]) self.japan_wide = [] self.japan_wide60 = self.exp60 self.japan_wide120 = self.exp60 self.japan_wide180 = self.exp60 self.japan_wide240 = self.exp60 self.japan_wide300 = self.exp60 self.japan_wide360 = self.exp60 self.japan_wide.extend([self.japan_wide60,self.japan_wide120,self.japan_wide180, self.japan_wide240,self.japan_wide300,self.japan_wide360]) self.CHANGED = False self.LOAD_STARTED = False self.base_url = "https://tenki.jp/radar/{}rainmesh.html" self.save_path = WeatherPath + "radar/" #予測-拡大 self.expansion_file_name = self.save_path + "predictive-expansion{}.jpg" #予測-周辺 self.wide_file_name = self.save_path + "predictive-wide{}.jpg" #予測-日本広域 self.japan_wide_file_name = self.save_path + "predictive-japan_wide{}.jpg" def stop(self): self.stop_event.set() def run(self): foreign = cv2.imread(WeatherPath + "radar/movement_foreign.jpg") loading = cv2.imread(WeatherPath + "radar/movement_loading.jpg") load_failed = cv2.imread(WeatherPath + "radar/movement_load_failed.jpg") def gen_predictive_urls(_dict,url,filename): for hour in range(60,361,60): pre_filename = filename.format(str(hour)) split_radar_url = url.split("/") pre_hour = split_radar_url[5].replace(split_radar_url[5],str(hour)) split_radar_url[5] = pre_hour pre_radar_url = "/".join(split_radar_url) _dict[pre_radar_url] = pre_filename while not self.stop_event.is_set(): self.LOAD_STARTED = True if self.radar_code == "None": for i,img in enumerate(self.expansion): self.expansion[i] = foreign self.wide[i] = foreign self.japan_wide[i] = foreign continue #日本広域 self.japan_wide_url = self.base_url.format("") #拡大 self.radar_url = self.base_url.format(self.radar_code) #周辺 self.radar_area_url = self.base_url.format(self.radar_area_code) if self.CHANGED == True: for i,img in enumerate(self.expansion): self.expansion[i] = loading self.wide[i] = loading self.japan_wide[i] = loading self.CHANGED = False try: radar_source = urlopen(self.radar_url, timeout=2) radar_source = BS(radar_source.read(), "lxml") radar_area_source = urlopen(self.radar_area_url, timeout=2) radar_area_source = BS(radar_area_source.read(), "lxml") radar_wide_source = urlopen(self.japan_wide_url, timeout=2) radar_wide_source = BS(radar_wide_source.read(), "lxml") except: radar_source = None radar_area_source = None radar_wide_source = None for i,img in enumerate(self.expansion): self.expansion[i] = load_failed self.wide[i] = load_failed self.japan_wide[i] = load_failed time.sleep(1) continue try: expansion_source = radar_source.find_all("img") expansion_url = expansion_source[8] expansion_url = expansion_url.get("src") wide_source = radar_area_source.find_all("img") wide_url = wide_source[8] wide_url = wide_url.get("src") japan_wide_source = radar_wide_source.find_all("img") japan_wide_url = japan_wide_source[8] japan_wide_url = japan_wide_url.get("src") expansion_url_name = {} wide_url_name = {} japan_wide_url_name = {} gen_predictive_urls(expansion_url_name, expansion_url,self.expansion_file_name) gen_predictive_urls(wide_url_name, wide_url,self.wide_file_name) gen_predictive_urls(japan_wide_url_name, japan_wide_url,self.japan_wide_file_name) except: expansion_url_name = None wide_url_name = None japan_wide_url_name = None for i,img in enumerate(self.expansion): self.expansion[i] = load_failed self.wide[i] = load_failed self.japan_wide[i] = load_failed time.sleep(1) continue headers = { "User-Agent":"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:47.0) Gecko/20100101 Firefox/47.0", } """拡大画像ダウンロード""" try: for count,url in enumerate(expansion_url_name): r = requests.get(url, timeout=2, headers=headers) urllib.request.urlretrieve( url=url ) if r.status_code==200: f = open(expansion_url_name[url], "wb") f.write(r.content) f.close() self.expansion[count] = cv2.imread(expansion_url_name[url]) self.expansion[count] = cv2.resize(self.expansion[count], (406,248)) else: for i,img in enumerate(self.expansion): self.expansion[i] = load_failed break except: for i,img in enumerate(self.expansion): self.expansion[i] = load_failed time.sleep(1) continue """""" """周辺画像ダウンロード""" try: for count,url in enumerate(wide_url_name): r = requests.get(url, timeout=2, headers=headers) urllib.request.urlretrieve( url=url ) if r.status_code==200: f = open(wide_url_name[url], "wb") f.write(r.content) f.close() self.wide[count] = cv2.imread(wide_url_name[url]) self.wide[count] = cv2.resize(self.wide[count], (406,248)) else: for i,img in enumerate(self.wide): self.wide[i] = load_failed break except: for i,img in enumerate(self.wide): self.wide[i] = load_failed time.sleep(1) continue """""" """日本広域ダウンロード""" try: for count,url in enumerate(japan_wide_url_name): r = requests.get(url, timeout=2, headers=headers) urllib.request.urlretrieve( url=url ) if r.status_code==200: f = open(japan_wide_url_name[url], "wb") f.write(r.content) f.close() self.japan_wide[count] = cv2.imread(japan_wide_url_name[url]) self.japan_wide[count] = cv2.resize(self.japan_wide[count], (406,248)) else: for i,img in enumerate(self.japan_wide): self.japan_wide[i] = load_failed break except: for i,img in enumerate(self.japan_wide): self.japan_wide[i] = load_failed time.sleep(1) continue """""" time.sleep(1) continue #---end_012--- PRD = PredictiveRadarDownload() thread_list.append(PRD) #-----013_予報レーダー動き付け----- class TurnOnMotionRadar(threading.Thread): def __init__(self): super(TurnOnMotionRadar, self).__init__() self.stop_event = threading.Event() self.setDaemon(True) self.icon_msg = PRD.icon_msg self.legend = PRD.legend self.img = cv2.imread(WeatherPath + "radar/movement_loading.jpg") self.area_img = self.img self.wide_area_img = self.img def stop(self): self.stop_event.set() def run(self): while not self.stop_event.is_set(): for i in range(6): self.img = PRD.expansion[i] self.area_img = PRD.wide[i] self.wide_area_img = PRD.japan_wide[i] time.sleep(0.5) #---end_013--- TOMR = TurnOnMotionRadar() thread_list.append(TOMR)
息抜きにプログラムを書くのもいいものです。
皆さんも是非。
久しぶりにブログを書いて
良い息抜きになりました。
以上、
Python大好き なりけんさん
でした。
またいつか。
以下、備忘録
2018/2/3追記
予想最高と予想最低も
出してみました。
2018/2/4追記
0時から15時までは予想最高
15時以降はその日の最高
0時から6時までは予想最低
6時以降はその日の最低
を出すようにしてみました。
本日二度目の追記
降水確率も出してみました。
2018/2/5追記
湿度と明日の天気も(ry
2018/2/6追記
明日の予想最高とよs(ry
2018/2/??追記
・温度、湿度、曜日による背景色の変更。
・時報機能追加。
2018/2/25追記
・占い追加
2018/2/27追記
・表示する情報を変更できるようにしました。
2018/3/1追記
・更新
2018/3/3追記
・更新
2018/3/4追記
・ちょっと変更
2018/3/13追記
・レーダー画像をクリックすると
日本広域のレーダーに切り替わるようにしてみました。
2018/3/22追記
クリックしたところのソースに飛ぶように。
就活(笑)は終わったので
そろそろ卒研の方に注力しますかね。
「出来るだけたくさんの会社の説明会に行った方が良いよ」
というアドバイスを、とある企業の取締役の方から頂いたので
気が向いたら行ってみようと思います。
2018/3/25追記
レーダーを左クリックで周辺拡大。
レーダーを右クリックで日本広域。
2018/3/26追記
表示する情報の追加に伴って
GUIの若干の変更。
2018/3/28追記
雨雲の動き(予報)を追加。
6時間後までの雨雲の動きを
アニメーションで表示出来るようにしました。
2018/3/29追記
PM2.5と花粉の飛散予測も
アニメーションに変更。
48時間後まで。
一応、小さいモニタ用の画像選択タイプと
大きいモニタ用の縦長タイプがあります。
2018/4/13追記
この先の一時間ごとの天気を表示できるようにしました。
2018年7月5日追記
自分で作っておいてなんなのですが
初めて猛暑日の色を見ました笑
これから連日こうなるのかと思うと辛いですね...