from PIL import Image, ImageDraw, ImageFont import numpy as np import datetime """Two colors: 1 main color and 1 accent color. These are labeled in the matrix as 1 and 2""" def text_converter(text, height): """Converts a text to a pixel-matrix returns: np.array((16, x))""" font = ImageFont.truetype("verdanab.ttf", height) size = font.getsize(text) img = Image.new("1",size,"black") draw = ImageDraw.Draw(img) draw.text((0, 0), text, "white", font=font) pixels = np.array(img, dtype=np.uint8) return pixels digits = { "1" : [[0,0,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]], "2" : [[1,1,1],[0,0,1],[1,1,1],[1,0,0],[1,1,1]], "3" : [[1,1,1],[0,0,1],[1,1,1],[0,0,1],[1,1,1]], "4" : [[1,0,1],[1,0,1],[1,1,1],[0,0,1],[0,0,1]], "5" : [[1,1,1],[1,0,0],[1,1,1],[0,0,1],[1,1,1]], "6" : [[1,1,1],[1,0,0],[1,1,1],[1,0,1],[1,1,1]], "7" : [[1,1,1],[0,0,1],[0,0,1],[0,0,1],[0,0,1]], "8" : [[1,1,1],[1,0,1],[1,1,1],[1,0,1],[1,1,1]], "9" : [[1,1,1],[1,0,1],[1,1,1],[0,0,1],[1,1,1]], "0" : [[1,1,1],[1,0,1],[1,0,1],[1,0,1],[1,1,1]], "-" : [[0,0,0],[0,0,0],[1,1,1],[0,0,0],[0,0,0]], "-1" : [[0,0,1],[0,0,1],[1,1,1],[0,0,1],[0,0,1]], "error" : [[1,0,1],[1,0,1],[0,1,0],[1,0,1],[1,0,1]], } ##place of numbers, invariant digit_position = [[2,4], [2,10], [9,4], [9,10]] def time_converter(top="", bottom=""): """Converts 4-digit time to a pixel-matrix returns: np.array((16, 16))""" pixels = np.zeros((16,16),dtype=np.uint8) if bottom == "" or top == "": top = datetime.datetime.now().strftime("%H") bottom = datetime.datetime.now().strftime("%M") if len(top) < 2: top = "0" * (2 - len(top)) + top if len(bottom) < 2: bottom = "0" * (2 - len(bottom)) + bottom if ("-" in top and len(top) > 2) or ("-" in bottom and len(bottom) > 2): time_split = 4*["-"] elif "error" in top and "error" in bottom: time_split = 4*["error"] else: time_split = [i for i in top] + [i for i in bottom] if "-1" in top and len(top) != 2: time_split = ["-1", top[-1]] + [i for i in bottom] if "-1" in bottom and len(bottom) != 2: time_split = [i for i in top] + ["-1", bottom[-1]] for i in range(4): x = digit_position[i][0] y = digit_position[i][1] number = digits[time_split[i]] pixels[x: x + 5, y: y + 3] = np.array(number) return pixels days = np.append(np.zeros((15,16)), np.array([0,1,0,1,0,1,0,1,0,1,0,1,1,0,1,1])).reshape((16,16)) def date_converter(): today = datetime.datetime.today() weekday = datetime.datetime.weekday(today) # size of the reduced array according to weekday size = [2,4,6,8,10,13,16] pixels = days.copy() #base color background lrow = np.append(pixels[15,:size[weekday]], [0 for i in range(16 - size[weekday])]) lrow = np.append(np.zeros((15,16)), lrow).reshape((16,16)) pixels += lrow return pixels weather_categories = { "Clouds": "cloud", "Rain": "rain and cloud", "Thunderstorm": "thunder and cloud", "Drizzle": "rain and cloud", "Snow": "snow and cloud", "Clear": "sun", "Mist": "fog and clouds", "Smoke": "Smoke", "Haze": "Haze", "Dust": "Dust", "Fog": "fog", "Sand": "Sand", "Dust": "Dust", "Ash": "Ash", "Squal": "Squal", "Tornado": "Tornado", "error" : "moon" } def weather_converter(name): result = np.zeros((16,16)) cwd = __file__.replace("\\","/") # for windows cwd = cwd.rsplit("/", 1)[0] # the current working directory (where this file is) if len(cwd) == 0: cwd = "." icon_spritesheet = cwd + "/weather-icons.bmp" icons = Image.open(icon_spritesheet) icons_full = np.array(icons) icon_loc = ["sun","moon","sun and clouds", "moon and clouds", "cloud","fog and clouds","2 clouds", "3 clouds", "rain and cloud", "rain and clouds", "rain and cloud and sun", "rain and cloud and moon", "thunder and cloud", "thunder and cloud and moon", "snow and cloud", "snow and cloud and moon", "fog","fog night"] #ordered 1 2 \n 3 4 \ 5 5 ... name = weather_categories[name] try: iy, ix = int(icon_loc.index(name)/2), icon_loc.index(name)%2 # x and y coords except: return np.zeros((16,16,3)) icon_single = icons_full[16*iy:16*(iy + 1),16*ix:16*(ix + 1),...] return icon_single