weatherstation-display/display.py

106 lines
2.7 KiB
Python

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import logging
logging.basicConfig(level=logging.INFO,
format='%(asctime)s - %(levelname)s - %(message)s',
datefmt='%Y-%m-%d %H:%m:%S')
import gi
gi.require_version('Gtk', '3.0')
gi.require_version('GdkPixbuf', '2.0')
from gi.repository import Gtk,GdkPixbuf, GLib
from io import BytesIO
import argparse
import threading
import time
from datetime import date
import signal
import requests
DEFAULT_BASE = "https://www.agp8x.org/temp/new/pchart/"
log = logging
def today():
return date.today().strftime("temp_%d.%m.%Y.png")
class Updater(threading.Thread):
def __init__(self, target):
threading.Thread.__init__(self)
self.target = target
self.exit = threading.Event()
def run(self):
while not self.exit.is_set():
try:
log.info("run update")
self.target.update()
except Exception as e:
log.exception(e)
self.exit.wait(300)
class Window(object):
def __init__(self, args):
self.window = Gtk.Window()
self.window.set_title("weather")
self.window.set_default_size(800, 450)
#self.window.set_resizable(False)
self.window.connect("destroy", self.destroy)
self.window.connect("key-press-event", self.on_key)
#self.window.connect("button-press-event", self.on_click)
self.args = args
if self.args.fullscreen:
log.info("use fullscreen")
self.window.fullscreen()
self.image = Gtk.Image()
self.window.add(self.image)
self.image.show()
self.window.show()
GLib.unix_signal_add(GLib.PRIORITY_DEFAULT,
signal.SIGINT, self.destroy)
def destroy(self, data=None):
if self.updater:
self.updater.exit.set()
Gtk.main_quit()
def main(self):
self.updater = Updater(self)
self.updater.start()
Gtk.main()
def on_click(self, widget, data=None):
log.info("on_click called")
self.update()
def on_key(self, event, data=None):
log.info("on_key called")
self.destroy()
def update(self):
log.info("start update")
filename = today()
url = self.args.base_url + "/" + filename
new_image = self.fetch_image(url)
self.image.set_from_pixbuf(new_image)
log.info("update finished")
def fetch_image(self, url):
log.info("start download")
response = requests.get(url)
log.info(f"result({url})={response.status_code}, {response.ok}")
with BytesIO(response.content) as buff:
loader = GdkPixbuf.PixbufLoader.new_with_type('png')
loader.write(buff.getvalue())
pixbuf = loader.get_pixbuf()
loader.close()
return pixbuf.scale_simple(800, 450, GdkPixbuf.InterpType.BILINEAR)
if __name__=="__main__":
parser = argparse.ArgumentParser()
parser.add_argument("base_url", nargs="?", default=DEFAULT_BASE)
parser.add_argument("-f", "--fullscreen", action="store_false", help="don't start in fullscreen")
args = parser.parse_args()
window = Window(args)
window.main()