なりけんぶろぐ

なりけんぶろぐ

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

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

さすがにそろそろ...

2018年7月5日追記

自分で作っておいてなんなのですが

初めて猛暑日の色を見ました笑

これから連日こうなるのかと思うと辛いですね...f:id:nariken1226:20180704192640j:plain