なりけんぶろぐ

なりけんぶろぐ

ガジェットやアニメが好きなゆとり世代の産物が気まぐれで更新中。

Pythonで簡単なウィジェット作ってみた

こんにちは。

宇宙よりも遠い場所に憧れる

21歳のしがない大学生です。

 

 

暇つぶし、息抜きにこんなの作りました。

言語はみんな大好きPython3です。

f:id:nariken1226:20180413220643j:plain

こんなの

f:id:nariken1226:20180414094039j:plain

変更も出来ます

個人的には気に入ってます。

というか

我ながら良い物が出来たなぁと。

しみじみ。

_人人人人人人_
> 手前味噌 
 ̄Y^Y^Y^Y^Y ̄

ちなみに

表示されている情報をクリックすると

その情報のソースに飛びます。

 

 

「平常運転」と出ているところは

[平常運転,遅延,運転見合わせ,交通障害,運行情報あり,接続エラー,情報取得中]

の7種類の表示に対応させています。

 

こういう時に限って遅延しない中央線はナンバリングを「KY」に変えた方が良い。

 

ちなみに、ちゃんと(?)

接続エラーにも対応しています。

f:id:nariken1226:20180307221631j:plain

こういうの好き

ソースコード(一部)

#-----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追記

予想最高と予想最低も

出してみました。

f:id:nariken1226:20180203142819j:plain

今日は割と暖かい(*´ω`)

2018/2/4追記

0時から15時までは予想最高

15時以降はその日の最高

 

0時から6時までは予想最低

6時以降はその日の最低

 

を出すようにしてみました。

f:id:nariken1226:20180204084900j:plain

日曜日は絶対に外に出ない
本日二度目の追記


降水確率も出してみました。

f:id:nariken1226:20180204143040j:plain

そろそろやめにしないとキリがない


2018/2/5追記

湿度と明日の天気も(ry

f:id:nariken1226:20180205121203j:plain

止められない止まらない

2018/2/6追記

明日の予想最高とよs(ry

f:id:nariken1226:20180206111039j:plain

ふぅ

2018/2/??追記

・温度、湿度、曜日による背景色の変更。

時報機能追加。

f:id:nariken1226:20180215111837j:plain

春らしくなってきましたね

2018/2/25追記

・占い追加

f:id:nariken1226:20180225085454j:plain

そんなに悪くない

 2018/2/27追記

・表示する情報を変更できるようにしました。

f:id:nariken1226:20180228190023j:plain

とりあえずβ版

 2018/3/1追記

・更新

f:id:nariken1226:20180301111931j:plain

次はデザインを...

 2018/3/3追記

・更新

f:id:nariken1226:20180303113116j:plain

デフォルトに戻すボタンをつけたい

 

f:id:nariken1226:20180303140140j:plain

付けた

 2018/3/4追記

・ちょっと変更

f:id:nariken1226:20180304131833j:plain

前のは縦長すぎた

 2018/3/13追記

・レーダー画像をクリックすると

日本広域のレーダーに切り替わるようにしてみました。

f:id:nariken1226:20180315200449j:plain

mouseParamが少し不安定

 2018/3/22追記

クリックしたところのソースに飛ぶように。

 

就活(笑)は終わったので

そろそろ卒研の方に注力しますかね。

「出来るだけたくさんの会社の説明会に行った方が良いよ」

というアドバイスを、とある企業の取締役の方から頂いたので

気が向いたら行ってみようと思います。

 

2018/3/25追記

レーダーを左クリックで周辺拡大。

レーダーを右クリックで日本広域。

f:id:nariken1226:20180325144636j:plain

いいねぇ

2018/3/26追記

表示する情報の追加に伴って

GUIの若干の変更。

f:id:nariken1226:20180326002739j:plain

ますます便利になった


2018/3/28追記

雨雲の動き(予報)を追加。

6時間後までの雨雲の動きを

アニメーションで表示出来るようにしました。

2018/3/29追記

PM2.5と花粉の飛散予測も

アニメーションに変更。

48時間後まで。

 

一応、小さいモニタ用の画像選択タイプと

大きいモニタ用の縦長タイプがあります。

f:id:nariken1226:20180329222444j:plain

研究室の2K縦モニタ用

2018/4/13追記

この先の一時間ごとの天気を表示できるようにしました。

f:id:nariken1226:20180413220643j:plain

さすがにそろそろ...

 

広告を非表示にする