#!/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()