startup logo added and dynamic weather layout
This commit is contained in:
BIN
logos/startup_logo_1.gif
Normal file
BIN
logos/startup_logo_1.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 50 KiB |
@@ -44,6 +44,7 @@ ALLOWED_EXTENSIONS = {'csv', 'png'}
|
|||||||
|
|
||||||
ticker = pexpect.spawn("sudo -E python3 stockTicker.py")
|
ticker = pexpect.spawn("sudo -E python3 stockTicker.py")
|
||||||
ticker.sendline('*') # run by default
|
ticker.sendline('*') # run by default
|
||||||
|
time.sleep(1)
|
||||||
ticker.sendline('A') # run by default
|
ticker.sendline('A') # run by default
|
||||||
|
|
||||||
def allowed_file(filename):
|
def allowed_file(filename):
|
||||||
|
127
stockTicker.py
127
stockTicker.py
@@ -728,19 +728,19 @@ class StockTicker():
|
|||||||
|
|
||||||
return imgs
|
return imgs
|
||||||
|
|
||||||
def displayGIF(self, gif):
|
def displayGIF(self, gif, delay = 0.5, repeat = True):
|
||||||
# To iterate through the entire gif
|
# To iterate through the entire gif
|
||||||
i = 0
|
i = 0
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
||||||
gif.seek(i)
|
gif.seek(i)
|
||||||
except EOFError:
|
except EOFError:
|
||||||
|
if not repeat: break
|
||||||
i = 0
|
i = 0
|
||||||
gif.seek(i)
|
gif.seek(i)
|
||||||
# do something to im
|
# do something to im
|
||||||
self.setImage(gif.convert('RGB'))
|
self.setImage(gif.convert('RGB'))
|
||||||
time.sleep(0.5)
|
time.sleep(delay)
|
||||||
i += 1
|
i += 1
|
||||||
try:
|
try:
|
||||||
msg = getInput()
|
msg = getInput()
|
||||||
@@ -1804,17 +1804,12 @@ class StockTicker():
|
|||||||
|
|
||||||
for i, location in enumerate(locations):
|
for i, location in enumerate(locations):
|
||||||
try:
|
try:
|
||||||
img = Image.new('RGB', (208, 32))
|
|
||||||
|
|
||||||
|
|
||||||
current_weather = current_weathers[location]
|
current_weather = current_weathers[location]
|
||||||
small_font = ImageFont.load("./fonts/5x7.pil")
|
small_font = ImageFont.load("./fonts/5x7.pil")
|
||||||
large_font = ImageFont.load("./fonts/10x20.pil")
|
large_font = ImageFont.load("./fonts/10x20.pil")
|
||||||
|
|
||||||
location_img = self.textImage(location.upper(), small_font, r = 255, g = 255, b = 0)
|
location_img = self.textImage(location.upper(), small_font, r = 255, g = 255, b = 0)
|
||||||
|
|
||||||
img.paste(location_img, (5,0))
|
|
||||||
|
|
||||||
main = current_weather['main_weather']
|
main = current_weather['main_weather']
|
||||||
if main == 'Clouds':
|
if main == 'Clouds':
|
||||||
main = current_weather['description']
|
main = current_weather['description']
|
||||||
@@ -1823,12 +1818,7 @@ class StockTicker():
|
|||||||
'Sand': '50', 'Ash': '50', 'Squall': '50', 'Tornado': '50'}
|
'Sand': '50', 'Ash': '50', 'Squall': '50', 'Tornado': '50'}
|
||||||
|
|
||||||
weather_dir = './logos/weather_icons'
|
weather_dir = './logos/weather_icons'
|
||||||
|
|
||||||
weather_img = Image.open(weather_dir + '/weather_type_icons/' + weather_ids[main] + '.png')
|
weather_img = Image.open(weather_dir + '/weather_type_icons/' + weather_ids[main] + '.png')
|
||||||
img.paste(weather_img, (5,9))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
temp = current_weather['temp']
|
temp = current_weather['temp']
|
||||||
feels_temp = current_weather['feels_like']
|
feels_temp = current_weather['feels_like']
|
||||||
if all_settings['temp'] == 'kelvin':
|
if all_settings['temp'] == 'kelvin':
|
||||||
@@ -1838,82 +1828,88 @@ class StockTicker():
|
|||||||
temp = current_weather['temp']*9/5 + 32
|
temp = current_weather['temp']*9/5 + 32
|
||||||
|
|
||||||
temp_img = self.textImage(str("{0:.0f}".format(temp)), large_font)
|
temp_img = self.textImage(str("{0:.0f}".format(temp)), large_font)
|
||||||
img.paste(temp_img, (39,9))
|
|
||||||
|
|
||||||
deg_img = self.textImage('o', small_font)
|
deg_img = self.textImage('o', small_font)
|
||||||
|
|
||||||
img.paste(deg_img, (59, 8))
|
|
||||||
|
|
||||||
main = current_weather['main_weather']
|
main = current_weather['main_weather']
|
||||||
main_img = self.textImage(main.upper(), small_font)
|
main_img = self.textImage(main.upper(), small_font)
|
||||||
img.paste(main_img, (35, 26))
|
|
||||||
|
|
||||||
|
|
||||||
feels_img = self.textImage('Feels like:'.upper() + str("{0:.0f}".format(feels_temp)), small_font)
|
feels_img = self.textImage('Feels like:'.upper() + str("{0:.0f}".format(feels_temp)), small_font)
|
||||||
img.paste(feels_img, (location_img.size[0] + 10, 0))
|
|
||||||
|
|
||||||
min_img = self.textImage( "{0:.0f}".format(current_weather['min_temp']), small_font, r=0, g=0, b=255)
|
min_img = self.textImage( "{0:.0f}".format(current_weather['min_temp']), small_font, r=0, g=0, b=255)
|
||||||
img.paste(min_img, (66, 12))
|
|
||||||
|
|
||||||
max_img = self.textImage( "{0:.0f}".format(current_weather['max_temp']), small_font, r=255, g=0, b=0)
|
max_img = self.textImage( "{0:.0f}".format(current_weather['max_temp']), small_font, r=255, g=0, b=0)
|
||||||
img.paste(max_img, (66, 21))
|
|
||||||
|
|
||||||
hum_img = Image.open(weather_dir + '/humidity.png')
|
hum_img = Image.open(weather_dir + '/humidity.png')
|
||||||
img.paste(hum_img, ( 82, 8))
|
|
||||||
|
|
||||||
htext_img = self.textImage(str(current_weather['humidity']) + '%', small_font)
|
htext_img = self.textImage(str(current_weather['humidity']) + '%', small_font)
|
||||||
img.paste(htext_img, (95, 10))
|
|
||||||
|
|
||||||
uv_img = Image.open(weather_dir + '/uv.png')
|
uv_img = Image.open(weather_dir + '/uv.png')
|
||||||
img.paste(uv_img, ( 82, 22))
|
|
||||||
|
|
||||||
utext_img = self.textImage(str(round(current_weather['uv'], 1)) , small_font)
|
utext_img = self.textImage(str(round(current_weather['uv'], 1)) , small_font)
|
||||||
img.paste(utext_img, (95, 23))
|
|
||||||
|
|
||||||
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
|
||||||
months =['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
months =['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec']
|
||||||
month = months[int(datetime.now().strftime('%m'))-1]
|
month = months[int(datetime.now().strftime('%m'))-1]
|
||||||
date = str(int(datetime.now().strftime('%d')))
|
date = str(int(datetime.now().strftime('%d')))
|
||||||
|
|
||||||
weekday = weekdays[datetime.today().weekday()]
|
weekday = weekdays[datetime.today().weekday()]
|
||||||
|
|
||||||
date_img = self.textImage((month + ' ' + date + ',' + weekday).upper(), small_font)
|
date_img = self.textImage((month + ' ' + date + ',' + weekday).upper(), small_font)
|
||||||
img.paste(date_img, (132, 0))
|
|
||||||
|
|
||||||
rain_img = Image.open(weather_dir + '/rain-chance.png')
|
rain_img = Image.open(weather_dir + '/rain-chance.png')
|
||||||
img.paste(rain_img, (118,8))
|
|
||||||
|
|
||||||
|
|
||||||
rtext_img = self.textImage(str(int(current_weather['rain_chance']*100)) + '%', small_font)
|
rtext_img = self.textImage(str(int(current_weather['rain_chance']*100)) + '%', small_font)
|
||||||
img.paste(rtext_img, (131, 10))
|
|
||||||
|
|
||||||
cloud_img = Image.open(weather_dir + '/clouds.png')
|
cloud_img = Image.open(weather_dir + '/clouds.png')
|
||||||
img.paste(cloud_img, (118,20))
|
|
||||||
|
|
||||||
ctext_img = self.textImage(str(current_weather['clouds']) + '%', small_font)
|
ctext_img = self.textImage(str(current_weather['clouds']) + '%', small_font)
|
||||||
img.paste(ctext_img, (131, 22))
|
|
||||||
|
|
||||||
wind_img = Image.open(weather_dir + '/wind.png')
|
wind_img = Image.open(weather_dir + '/wind.png')
|
||||||
img.paste(wind_img, (154,8))
|
|
||||||
|
|
||||||
|
|
||||||
w_speed = current_weather['wind_speed']*3.6
|
w_speed = current_weather['wind_speed']*3.6
|
||||||
w_unit = 'K/H'
|
w_unit = 'K/H'
|
||||||
if all_settings["wind_speed"] == "miles/hour":
|
if all_settings["wind_speed"] == "miles/hour":
|
||||||
w_speed = current_weather['wind_speed']*2.236936
|
w_speed = current_weather['wind_speed']*2.236936
|
||||||
w_unit = 'M/H'
|
w_unit = 'M/H'
|
||||||
|
|
||||||
wtext_img = self.textImage("{0:.0f}".format(w_speed) + w_unit, small_font)
|
wtext_img = self.textImage("{0:.0f}".format(w_speed) + w_unit, small_font)
|
||||||
img.paste(wtext_img, (168, 10))
|
|
||||||
|
|
||||||
wdir_img = self.textImage(self.degreesToCompass(current_weather['wind_direction']).upper(), small_font)
|
wdir_img = self.textImage(self.degreesToCompass(current_weather['wind_direction']).upper(), small_font)
|
||||||
img.paste(wdir_img, (195, 10))
|
|
||||||
|
|
||||||
vis_img = Image.open(weather_dir + '/visibility.png')
|
vis_img = Image.open(weather_dir + '/visibility.png')
|
||||||
img.paste(vis_img, (154,20))
|
|
||||||
|
|
||||||
vtext_img = self.textImage(str(round(current_weather['visibility']/1000, 1)) + 'km'.upper(), small_font)
|
vtext_img = self.textImage(str(round(current_weather['visibility']/1000, 1)) + 'km'.upper(), small_font)
|
||||||
img.paste(vtext_img, (168, 22))
|
|
||||||
|
|
||||||
|
|
||||||
|
'------------------------------------------'
|
||||||
|
img = Image.new('RGB', (1000, 32))
|
||||||
|
|
||||||
|
img.paste(weather_img, (5,9))
|
||||||
|
x_offset = 5 + weather_img.size[0] + 1
|
||||||
|
|
||||||
|
img.paste(main_img, (x_offset, 26))
|
||||||
|
img.paste(temp_img, (x_offset + main_img.size[0]//2 - temp_img.size[0]//2,9))
|
||||||
|
|
||||||
|
img.paste(deg_img, (x_offset + main_img.size[0]//2 - temp_img.size[0]//2 + temp_img.size[0], 8))
|
||||||
|
|
||||||
|
x_offset += max( main_img.size[0], temp_img.size[0] + deg_img.size[0])
|
||||||
|
|
||||||
|
|
||||||
|
img.paste(min_img, (x_offset - 1, 12))
|
||||||
|
img.paste(max_img, (x_offset - 1, 21))
|
||||||
|
|
||||||
|
x_offset += max(min_img.size[0], max_img.size[0]) + 2
|
||||||
|
img.paste(hum_img, ( x_offset, 8))
|
||||||
|
img.paste(uv_img, ( x_offset, 22))
|
||||||
|
|
||||||
|
img.paste(htext_img, (x_offset + hum_img.size[0], 10))
|
||||||
|
img.paste(utext_img, (x_offset + uv_img.size[0], 23))
|
||||||
|
x_offset += max(hum_img.size[0], uv_img.size[0]+2)
|
||||||
|
x_offset += max(htext_img.size[0], utext_img.size[0]) + 6
|
||||||
|
|
||||||
|
|
||||||
|
img.paste(rain_img, (x_offset,8))
|
||||||
|
img.paste(cloud_img, (x_offset,20))
|
||||||
|
img.paste(ctext_img, (x_offset + cloud_img.size[0] + 2, 22))
|
||||||
|
img.paste(rtext_img, (x_offset + rain_img.size[0]+ 2, 10))
|
||||||
|
x_offset += max(cloud_img.size[0], rain_img.size[0])+6
|
||||||
|
x_offset += max(ctext_img.size[0], rtext_img.size[0])+6
|
||||||
|
img.paste(wind_img, (x_offset,8))
|
||||||
|
img.paste(vis_img, (x_offset,20))
|
||||||
|
img.paste(wtext_img, (x_offset + wind_img.size[0] + 2, 10))
|
||||||
|
img.paste(vtext_img, (x_offset + vis_img.size[0] + 2, 22))
|
||||||
|
x_offset += wind_img.size[0] + wtext_img.size[0] + 4
|
||||||
|
img.paste(wdir_img, (x_offset, 10))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
img = img.crop((0,0,x_offset +wdir_img.size[0] + 4 ,32))
|
||||||
|
|
||||||
|
img.paste(location_img, (5,0))
|
||||||
|
img.paste(feels_img, (location_img.size[0] + 10, 0))
|
||||||
|
img.paste(date_img, (location_img.size[0] + feels_img.size[0] + 15, 0))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
imgs.append(img)
|
imgs.append(img)
|
||||||
imgs.append(self.blank)
|
imgs.append(self.blank)
|
||||||
@@ -1925,7 +1921,7 @@ class StockTicker():
|
|||||||
self.logf.write('. line: ' + str(exc_tb.tb_lineno))
|
self.logf.write('. line: ' + str(exc_tb.tb_lineno))
|
||||||
self.logf.write('. type: ' + str(exc_type))
|
self.logf.write('. type: ' + str(exc_type))
|
||||||
self.logf.write('\n ' + "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])))
|
self.logf.write('\n ' + "".join(traceback.format_exception(sys.exc_info()[0], sys.exc_info()[1], sys.exc_info()[2])))
|
||||||
|
raise e
|
||||||
|
|
||||||
return self.stitchImage(imgs)
|
return self.stitchImage(imgs)
|
||||||
|
|
||||||
@@ -2705,11 +2701,16 @@ if __name__ == '__main__':
|
|||||||
stock_ticker.logf = log
|
stock_ticker.logf = log
|
||||||
|
|
||||||
start_image = Image.open('./logos/startup_logo.png')
|
start_image = Image.open('./logos/startup_logo.png')
|
||||||
|
start_GIF = Image.open('./logos/startup_logo_1.gif')
|
||||||
|
|
||||||
msg = getInput()
|
msg = getInput()
|
||||||
if msg =='*':
|
if msg =='*':
|
||||||
stock_ticker.setImage(start_image)
|
#
|
||||||
time.sleep(1)
|
#
|
||||||
|
|
||||||
|
stock_ticker.displayGIF(start_GIF, delay = 0.02, repeat = False)
|
||||||
|
#stock_ticker.setImage(start_image)
|
||||||
|
time.sleep(2)
|
||||||
stock_ticker.resetMatrix()
|
stock_ticker.resetMatrix()
|
||||||
|
|
||||||
#stock_ticker.getLeagueImage('NHL', 'future')
|
#stock_ticker.getLeagueImage('NHL', 'future')
|
||||||
@@ -2720,7 +2721,7 @@ if __name__ == '__main__':
|
|||||||
#stock_ticker.process_msg('G')
|
#stock_ticker.process_msg('G')
|
||||||
#stock_ticker.process_msg('f')
|
#stock_ticker.process_msg('f')
|
||||||
#stock_ticker.process_msg('W')
|
#stock_ticker.process_msg('W')
|
||||||
#stock_ticker.process_msg('A')
|
stock_ticker.process_msg('A')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user