transition animations added and sports tidied up
This commit is contained in:
+3
-1
@@ -451,12 +451,14 @@ if __name__ == '__main__':
|
|||||||
finnhubAPIkey = "c24qddqad3ickpckgg80" #Finnhub
|
finnhubAPIkey = "c24qddqad3ickpckgg80" #Finnhub
|
||||||
finnhubsandboxAPIkey = "sandbox_c24qddqad3ickpckgg8g" #Finnhub
|
finnhubsandboxAPIkey = "sandbox_c24qddqad3ickpckgg8g" #Finnhub
|
||||||
stock_time = 2 #minutes
|
stock_time = 2 #minutes
|
||||||
|
crypto_time = 10 #minutes
|
||||||
news_time = 30 #minutes
|
news_time = 30 #minutes
|
||||||
weather_time = 10 #minutes
|
weather_time = 10 #minutes
|
||||||
|
|
||||||
# TODO: different update times for stocks, weather and news
|
# TODO: different update times for stocks, weather and news
|
||||||
finnhubClient = finnhub.Client(api_key=finnhubAPIkey)
|
finnhubClient = finnhub.Client(api_key=finnhubAPIkey)
|
||||||
max_stocks = 200
|
max_stocks = 200
|
||||||
|
max_crypto = 100
|
||||||
|
|
||||||
iexAPIkey = 'pk_68ef6a15902c41f887f0b544a0ca17cf' #IEX
|
iexAPIkey = 'pk_68ef6a15902c41f887f0b544a0ca17cf' #IEX
|
||||||
iexSandboxAPIkey = 'Tpk_0078dff413ef4f979137f7111452dc4b'
|
iexSandboxAPIkey = 'Tpk_0078dff413ef4f979137f7111452dc4b'
|
||||||
@@ -478,7 +480,7 @@ if __name__ == '__main__':
|
|||||||
symbols, stock_info = readCSV('csv/tickers.csv', max_stocks)
|
symbols, stock_info = readCSV('csv/tickers.csv', max_stocks)
|
||||||
updateStockPrices(symbols)
|
updateStockPrices(symbols)
|
||||||
updateUpdate(NY_time)
|
updateUpdate(NY_time)
|
||||||
coins, coin_info, unique_bases = readCryptoCSV('csv/crypto.csv', max_stocks)
|
coins, coin_info, unique_bases = readCryptoCSV('csv/crypto.csv', max_crypto)
|
||||||
|
|
||||||
weather_key = 'bd5d5096a5ba30bbcfb57ead42ab3fee'
|
weather_key = 'bd5d5096a5ba30bbcfb57ead42ab3fee'
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -1,3 +1,3 @@
|
|||||||
symbol,name,base,current,24hr change
|
symbol,name,base,current,24hr change
|
||||||
BTC,bitcoin,usd,32709,-5.776193166295658
|
BTC,bitcoin,usd,32955,0.18795236810340699
|
||||||
ETH,ethereum,gbp,1419.48,-7.468105883111548
|
ETH,ethereum,gbp,1388.1,-1.2416916112022245
|
||||||
|
|||||||
|
+1
-1
@@ -1 +1 @@
|
|||||||
["USD", {"AUD": [1.2965, 1.3001], "CAD": [1.2177, 1.2189], "CHF": [0.89871, 0.90015], "EUR": [0.82481, 0.8259], "GBP": [0.70793, 0.71151], "JPY": [109.86, 110.08], "NZD": [1.3981, 1.403]}]
|
["USD", {"AUD": [1.3299, 1.3305], "CAD": [1.2381, 1.2411], "CHF": [0.92004, 0.9212], "EUR": [0.84076, 0.84097], "GBP": [0.71935, 0.72046], "JPY": [110.56, 110.09], "NZD": [1.4302, 1.4344]}]
|
||||||
@@ -1 +1 @@
|
|||||||
{"main_weather": "Clouds", "description": "overcast clouds", "temp": 29.78, "min_temp": 27.98, "max_temp": 30.21, "feels_like": 36.78, "humidity": 88, "clouds": 100, "wind_speed": 0.89, "wind_direction": 278, "visibility": 10000, "uv": 0, "rain_chance": 0.74}
|
{"main_weather": "Clouds", "description": "overcast clouds", "temp": 26.64, "min_temp": 25.58, "max_temp": 27.4, "feels_like": 26.64, "humidity": 90, "clouds": 100, "wind_speed": 0.45, "wind_direction": 135, "visibility": 10000, "uv": 0, "rain_chance": 1}
|
||||||
@@ -1 +1 @@
|
|||||||
[{"main_weather": "Rain", "description": "moderate rain", "min_temp": 28.51, "max_temp": 29.9}, {"main_weather": "Rain", "description": "very heavy rain", "min_temp": 25.39, "max_temp": 28.65}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.23, "max_temp": 27.86}, {"main_weather": "Rain", "description": "light rain", "min_temp": 27.08, "max_temp": 29.59}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.28, "max_temp": 30.13}, {"main_weather": "Rain", "description": "light rain", "min_temp": 28.33, "max_temp": 29.98}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.18, "max_temp": 28.89}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 26.62, "max_temp": 27.71}]
|
[{"main_weather": "Rain", "description": "heavy intensity rain", "min_temp": 24.83, "max_temp": 27.8}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 25.07, "max_temp": 26.83}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 26.55, "max_temp": 29}, {"main_weather": "Rain", "description": "light rain", "min_temp": 27.75, "max_temp": 29.78}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.93, "max_temp": 29.4}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 26.61, "max_temp": 28.14}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 27.57, "max_temp": 28.14}, {"main_weather": "Rain", "description": "moderate rain", "min_temp": 26.69, "max_temp": 28.13}]
|
||||||
+1
-1
@@ -1 +1 @@
|
|||||||
21/06/2021 12:41:07
|
22/06/2021 15:05:29
|
||||||
|
|||||||
|
+20
-20
@@ -1,21 +1,21 @@
|
|||||||
headline,source,date,time
|
headline,source,date,time
|
||||||
Live Updates: Tornado Hits Chicago Suburbs^ Causing Massive Damage - NBC Chicago,NBC Chicago,2021-06-21,14:36:30Z
|
‘I am not a vector’: Oireachtas committee hears from children affected by the pandemic - TheJournal.ie,TheJournal.ie,2021-06-22,18:30:00Z
|
||||||
Manchester City make Harry Kane bid worth at least £100m to Tottenham - The Guardian,The Guardian,2021-06-21,14:23:00Z
|
Liability conceded in case of couple ‘wrongly advised’ to terminate pregnancy - The Irish Times,The Irish Times,2021-06-22,18:15:58Z
|
||||||
Released but unspent: P18 billion for tests^ health workers expiring June 30 - Rappler,Rappler,2021-06-21,14:22:00Z
|
Delta COVID-19 variant greatest threat to US pandemic response - Fauci - GMA News Online,GMA News,2021-06-22,18:10:22Z
|
||||||
Israeli health experts share best practices on vaccine rollout - ABS-CBN News,Abs-cbn.com,2021-06-21,14:21:00Z
|
LIVE WTC Final IND vs NZ Live Cricket Score^ Today Match DAY 5 Updates: Kohli-Pujara in; India Lead New Zeala - India.com,India.com,2021-06-22,18:08:55Z
|
||||||
LIVE Southampton Weather Updates^ June 21^ Monday^ India vs New Zealand Day 4^ WTC 2021 Final: Play Called Of - India.com,India.com,2021-06-21,14:14:47Z
|
Prime Day headphone deals you shouldn't miss on AirPods^ Bose^ Beats^ Sony^ Samsung and more - CNET,CNET,2021-06-22,18:03:00Z
|
||||||
Handel im Wandel: Hybride Konsumenten? - APA OTS,Www.ots.at,2021-06-21,14:11:54Z
|
Jack Grealish^ Bukayo Saka and Harry Maguire start for England against Czech Republic - Sky Sports,Sky Sports,2021-06-22,18:01:14Z
|
||||||
Canada lifting restrictions for fully vaccinated travellers starting July 5 - CTV News,Ctvnews.ca,2021-06-21,14:11:53Z
|
Mother's gestational diabetes is an independent risk factor for fetal hypoxia during labor - News-Medical.Net,News-Medical.Net,2021-06-22,18:01:00Z
|
||||||
Philippines^ Saudi Arabia reaffirm vow to protect OFWs - ABS-CBN News,Abs-cbn.com,2021-06-21,14:11:00Z
|
Amazon sees Prime Day sales boost amid supply chain snags - CNA,CNA,2021-06-22,18:00:37Z
|
||||||
Geochemical study confirms cause of end-Permian mass extinction event - Phys.org,Phys.Org,2021-06-21,14:05:26Z
|
Twitter opens applications for Ticketed Spaces and Super Follows test - The Verge,The Verge,2021-06-22,18:00:00Z
|
||||||
The laptops and tablets worth your money on Prime Day - Yahoo Tech,Engadget,2021-06-21,14:05:13Z
|
Mastercard Foundation Appoints Robin Washington to Board of Directors - Guardian,Guardian Nigeria,2021-06-22,18:00:00Z
|
||||||
Gracie Spinks death: Derbyshire Police referred to watchdog - BBC News,BBC News,2021-06-21,14:03:22Z
|
Trudeau says border restrictions will be further relaxed 'in the coming weeks' if all goes well - CBC.ca,CBC News,2021-06-22,17:58:29Z
|
||||||
Paul Walker's Toyota Supra from The Fast and the Furious fetches over half a million - CNET,CNET,2021-06-21,14:02:17Z
|
Euro 2020 LIVE: Grealish and Maguire start for England^ Mount and Chilwell out of Czech Republic clash^... - talkSPORT.com,TalkSport,2021-06-22,17:47:23Z
|
||||||
Stock market news live updates: Stocks^ Treasury yields rise as Dow recovers after worst weekly loss since October - Yahoo Finance,Yahoo Entertainment,2021-06-21,14:00:10Z
|
Quarter of a million children in England missed school last week due to Covid - The Guardian,The Guardian,2021-06-22,17:46:00Z
|
||||||
Millions of new smart TVs^ laptops and other items in Amazon warehouse marked 'destroy' - TheJournal.ie,TheJournal.ie,2021-06-21,13:57:00Z
|
'I am appalled': Billie Eilish apologizes for mouthing racial slur in resurfaced video - CBC.ca,CBC News,2021-06-22,17:45:46Z
|
||||||
Target Deal Days rival Amazon Prime Day with massive discounts — here are the best deals to shop - Yahoo Finance Australia,Intheknow.com,2021-06-21,13:56:09Z
|
U.S. to narrowly miss Biden’s July 4 vaccination goal^ White House says - The Washington Post,The Washington Post,2021-06-22,17:45:00Z
|
||||||
PNB Housing Finance vs SEBI: SAT gives nod for EGM on June 22; Voting results to not be declared till... - Moneycontrol,Moneycontrol,2021-06-21,13:53:59Z
|
Vin Diesel explains feud with Dwayne Johnson: 'A lot of tough love' - Fox News,Fox News,2021-06-22,17:41:14Z
|
||||||
Sporadic Covid-19 cases still widespread in Klang Valley - Malaysiakini,Malaysiakini,2021-06-21,13:48:00Z
|
Today’s coronavirus news: Two-thirds of Canadians say governments shouldn’t lift all restrictions; Construction complete on new vaccine-manufacturing plant in Montreal; Ontario reporting 296 cases - Toronto Star,Toronto Star,2021-06-22,17:37:30Z
|
||||||
Samsung Odyssey G3^ Odyssey G5^ Odyssey G7 Gaming Monitors With 178 Degrees Viewing Angle Launched - Gadgets 360,NDTV News,2021-06-21,13:47:31Z
|
‘Tembisa 10’: Piet Rampedi pens apology to Independent Media staff for baby saga - News24,News24,2021-06-22,17:33:26Z
|
||||||
New possibilities for detecting Hawking radiation emitted by primordial black holes - Phys.org,Phys.Org,2021-06-21,13:40:03Z
|
Stinging secret: research reveals how venom from Australian caterpillars could be used in medicines - The Guardian,The Guardian,2021-06-22,17:31:00Z
|
||||||
Global Lip Fillers Market 2021 Industry Trends^ Growth^ Analysis^ Opportunities And Overview || DBMR – The Courier - The Courier,Mccourier.com,2021-06-21,13:39:38Z
|
Doc Rivers not giving up on Ben Simmons^ says 76ers have a plan in place to improve his shooting struggles - CBS Sports,CBS Sports,2021-06-22,17:28:00Z
|
||||||
|
|||||||
|
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-21", "time": "00:00:00", "round": "0", "home_team": "Philadelphia 76ers", "home_score": "96", "away_team": "Atlanta Hawks", "away_score": "103"}, {"date": "2021-06-23", "time": "01:00:00", "round": "0", "home_team": "Phoenix Suns", "home_score": null, "away_team": "Los Angeles Clippers", "away_score": null}, {"date": "2021-06-24", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": null, "away_team": "Atlanta Hawks", "away_score": null}, {"date": "2021-06-25", "time": "01:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": null, "away_team": "Phoenix Suns", "away_score": null}, {"date": "2021-06-26", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": null, "away_team": "Atlanta Hawks", "away_score": null}, {"date": "2021-06-27", "time": "01:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": null, "away_team": "Phoenix Suns", "away_score": null}, {"date": "2021-06-28", "time": "00:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": null, "away_team": "Milwaukee Bucks", "away_score": null}, {"date": "2021-06-30", "time": "00:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": null, "away_team": "Milwaukee Bucks", "away_score": null}]
|
[{"date": "2021-06-23", "time": "01:00:00", "round": "0", "home_team": "Phoenix Suns", "home_score": null, "away_team": "Los Angeles Clippers", "away_score": null}, {"date": "2021-06-24", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": null, "away_team": "Atlanta Hawks", "away_score": null}, {"date": "2021-06-25", "time": "01:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": null, "away_team": "Phoenix Suns", "away_score": null}, {"date": "2021-06-26", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": null, "away_team": "Atlanta Hawks", "away_score": null}, {"date": "2021-06-27", "time": "01:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": null, "away_team": "Phoenix Suns", "away_score": null}, {"date": "2021-06-28", "time": "00:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": null, "away_team": "Milwaukee Bucks", "away_score": null}, {"date": "2021-06-30", "time": "00:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": null, "away_team": "Milwaukee Bucks", "away_score": null}]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-21", "time": "00:00", "progess": "", "status": "FT", "home_team": "Philadelphia 76ers", "home_score": "96", "away_team": "Atlanta Hawks", "away_score": "103"}]
|
[]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-20", "time": "19:30:00", "round": "0", "home_team": "Phoenix Suns", "home_score": "120", "away_team": "Los Angeles Clippers", "away_score": "114"}, {"date": "2021-06-20", "time": "00:30:00", "round": "0", "home_team": "Brooklyn Nets", "home_score": "111", "away_team": "Milwaukee Bucks", "away_score": "115"}, {"date": "2021-06-19", "time": "02:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "131", "away_team": "Utah Jazz", "away_score": "119"}, {"date": "2021-06-18", "time": "23:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": "99", "away_team": "Philadelphia 76ers", "away_score": "104"}, {"date": "2021-06-18", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": "104", "away_team": "Brooklyn Nets", "away_score": "89"}, {"date": "2021-06-17", "time": "02:00:00", "round": "0", "home_team": "Utah Jazz", "home_score": "111", "away_team": "Los Angeles Clippers", "away_score": "119"}, {"date": "2021-06-16", "time": "00:30:00", "round": "0", "home_team": "Brooklyn Nets", "home_score": "114", "away_team": "Milwaukee Bucks", "away_score": "108"}, {"date": "2021-06-16", "time": "23:30:00", "round": "0", "home_team": "Philadelphia 76ers", "home_score": "106", "away_team": "Atlanta Hawks", "away_score": "109"}, {"date": "2021-06-15", "time": "02:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "118", "away_team": "Utah Jazz", "away_score": "104"}, {"date": "2021-06-14", "time": "23:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": "103", "away_team": "Philadelphia 76ers", "away_score": "100"}, {"date": "2021-06-14", "time": "00:00:00", "round": "0", "home_team": "Denver Nuggets", "home_score": "118", "away_team": "Phoenix Suns", "away_score": "125"}, {"date": "2021-06-13", "time": "00:30:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "132", "away_team": "Utah Jazz", "away_score": "106"}, {"date": "2021-06-13", "time": "19:00:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": "107", "away_team": "Brooklyn Nets", "away_score": "96"}, {"date": "2021-06-12", "time": "02:00:00", "round": "0", "home_team": "Denver Nuggets", "home_score": "102", "away_team": "Phoenix Suns", "away_score": "116"}, {"date": "2021-06-11", "time": "02:00:00", "round": "0", "home_team": "Utah Jazz", "home_score": "117", "away_team": "Los Angeles Clippers", "away_score": "111"}]
|
[{"date": "2021-06-21", "time": "00:00:00", "round": "0", "home_team": "Philadelphia 76ers", "home_score": "96", "away_team": "Atlanta Hawks", "away_score": "103"}, {"date": "2021-06-20", "time": "19:30:00", "round": "0", "home_team": "Phoenix Suns", "home_score": "120", "away_team": "Los Angeles Clippers", "away_score": "114"}, {"date": "2021-06-20", "time": "00:30:00", "round": "0", "home_team": "Brooklyn Nets", "home_score": "111", "away_team": "Milwaukee Bucks", "away_score": "115"}, {"date": "2021-06-19", "time": "02:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "131", "away_team": "Utah Jazz", "away_score": "119"}, {"date": "2021-06-18", "time": "23:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": "99", "away_team": "Philadelphia 76ers", "away_score": "104"}, {"date": "2021-06-18", "time": "00:30:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": "104", "away_team": "Brooklyn Nets", "away_score": "89"}, {"date": "2021-06-17", "time": "02:00:00", "round": "0", "home_team": "Utah Jazz", "home_score": "111", "away_team": "Los Angeles Clippers", "away_score": "119"}, {"date": "2021-06-16", "time": "00:30:00", "round": "0", "home_team": "Brooklyn Nets", "home_score": "114", "away_team": "Milwaukee Bucks", "away_score": "108"}, {"date": "2021-06-16", "time": "23:30:00", "round": "0", "home_team": "Philadelphia 76ers", "home_score": "106", "away_team": "Atlanta Hawks", "away_score": "109"}, {"date": "2021-06-15", "time": "02:00:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "118", "away_team": "Utah Jazz", "away_score": "104"}, {"date": "2021-06-14", "time": "23:30:00", "round": "0", "home_team": "Atlanta Hawks", "home_score": "103", "away_team": "Philadelphia 76ers", "away_score": "100"}, {"date": "2021-06-14", "time": "00:00:00", "round": "0", "home_team": "Denver Nuggets", "home_score": "118", "away_team": "Phoenix Suns", "away_score": "125"}, {"date": "2021-06-13", "time": "00:30:00", "round": "0", "home_team": "Los Angeles Clippers", "home_score": "132", "away_team": "Utah Jazz", "away_score": "106"}, {"date": "2021-06-13", "time": "19:00:00", "round": "0", "home_team": "Milwaukee Bucks", "home_score": "107", "away_team": "Brooklyn Nets", "away_score": "96"}, {"date": "2021-06-12", "time": "02:00:00", "round": "0", "home_team": "Denver Nuggets", "home_score": "102", "away_team": "Phoenix Suns", "away_score": "116"}]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-21", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "1", "away_team": "Vegas Golden Knights", "away_score": "2"}, {"date": "2021-06-22", "time": "00:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": null, "away_team": "New York Islanders", "away_score": null}, {"date": "2021-06-23", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": null, "away_team": "Montreal Canadiens", "away_score": null}, {"date": "2021-06-24", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": null, "away_team": "Tampa Bay Lightning", "away_score": null}, {"date": "2021-06-25", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": null, "away_team": "Vegas Golden Knights", "away_score": null}]
|
[{"date": "2021-06-22", "time": "00:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": "8", "away_team": "New York Islanders", "away_score": "0"}, {"date": "2021-06-23", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": null, "away_team": "Montreal Canadiens", "away_score": null}, {"date": "2021-06-24", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": null, "away_team": "Tampa Bay Lightning", "away_score": null}, {"date": "2021-06-25", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": null, "away_team": "Vegas Golden Knights", "away_score": null}]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-21", "time": "00:00", "progess": "", "status": "AOT", "home_team": "Montreal Canadiens", "home_score": "1", "away_team": "Vegas Golden Knights", "away_score": "2"}]
|
[{"date": "2021-06-22", "time": "00:00", "progess": "", "status": "FT", "home_team": "Tampa Bay Lightning", "home_score": "8", "away_team": "New York Islanders", "away_score": "0"}]
|
||||||
@@ -1 +1 @@
|
|||||||
[{"date": "2021-06-20", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": "3", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-19", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "3", "away_team": "Vegas Golden Knights", "away_score": "2"}, {"date": "2021-06-18", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": "1", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-17", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "2", "away_team": "Montreal Canadiens", "away_score": "3"}, {"date": "2021-06-16", "time": "00:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": "4", "away_team": "New York Islanders", "away_score": "2"}, {"date": "2021-06-15", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "4", "away_team": "Montreal Canadiens", "away_score": "1"}, {"date": "2021-06-13", "time": "19:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": "1", "away_team": "New York Islanders", "away_score": "2"}, {"date": "2021-06-11", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "6", "away_team": "Colorado Avalanche", "away_score": "3"}, {"date": "2021-06-09", "time": "23:30:00", "round": "0", "home_team": "New York Islanders", "home_score": "6", "away_team": "Boston Bruins", "away_score": "2"}, {"date": "2021-06-09", "time": "01:00:00", "round": "0", "home_team": "Colorado Avalanche", "home_score": "2", "away_team": "Vegas Golden Knights", "away_score": "3"}, {"date": "2021-06-08", "time": "22:30:00", "round": "0", "home_team": "Carolina Hurricanes", "home_score": "0", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-08", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "3", "away_team": "Winnipeg Jets", "away_score": "2"}, {"date": "2021-06-07", "time": "22:30:00", "round": "0", "home_team": "Boston Bruins", "home_score": "4", "away_team": "New York Islanders", "away_score": "5"}, {"date": "2021-06-07", "time": "00:30:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "5", "away_team": "Colorado Avalanche", "away_score": "1"}, {"date": "2021-06-06", "time": "22:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "5", "away_team": "Winnipeg Jets", "away_score": "1"}]
|
[{"date": "2021-06-21", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "1", "away_team": "Vegas Golden Knights", "away_score": "2"}, {"date": "2021-06-20", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": "3", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-19", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "3", "away_team": "Vegas Golden Knights", "away_score": "2"}, {"date": "2021-06-18", "time": "00:00:00", "round": "0", "home_team": "New York Islanders", "home_score": "1", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-17", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "2", "away_team": "Montreal Canadiens", "away_score": "3"}, {"date": "2021-06-16", "time": "00:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": "4", "away_team": "New York Islanders", "away_score": "2"}, {"date": "2021-06-15", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "4", "away_team": "Montreal Canadiens", "away_score": "1"}, {"date": "2021-06-13", "time": "19:00:00", "round": "0", "home_team": "Tampa Bay Lightning", "home_score": "1", "away_team": "New York Islanders", "away_score": "2"}, {"date": "2021-06-11", "time": "01:00:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "6", "away_team": "Colorado Avalanche", "away_score": "3"}, {"date": "2021-06-09", "time": "23:30:00", "round": "0", "home_team": "New York Islanders", "home_score": "6", "away_team": "Boston Bruins", "away_score": "2"}, {"date": "2021-06-09", "time": "01:00:00", "round": "0", "home_team": "Colorado Avalanche", "home_score": "2", "away_team": "Vegas Golden Knights", "away_score": "3"}, {"date": "2021-06-08", "time": "22:30:00", "round": "0", "home_team": "Carolina Hurricanes", "home_score": "0", "away_team": "Tampa Bay Lightning", "away_score": "2"}, {"date": "2021-06-08", "time": "00:00:00", "round": "0", "home_team": "Montreal Canadiens", "home_score": "3", "away_team": "Winnipeg Jets", "away_score": "2"}, {"date": "2021-06-07", "time": "22:30:00", "round": "0", "home_team": "Boston Bruins", "home_score": "4", "away_team": "New York Islanders", "away_score": "5"}, {"date": "2021-06-07", "time": "00:30:00", "round": "0", "home_team": "Vegas Golden Knights", "home_score": "5", "away_team": "Colorado Avalanche", "away_score": "1"}]
|
||||||
+3
-3
@@ -1,4 +1,4 @@
|
|||||||
name,current,opening
|
name,current,opening
|
||||||
MSFT,262.3,259.82
|
MSFT,265.24,262.72
|
||||||
NFLX,495.166,501.64
|
NFLX,511.198,498.54
|
||||||
GOOG,2529.965,2514.8
|
GOOG,2536.73,2529
|
||||||
|
|||||||
|
Executable
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 821 B |
Regular → Executable
|
Before Width: | Height: | Size: 2.9 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
Executable
BIN
Binary file not shown.
BIN
Binary file not shown.
@@ -7,16 +7,7 @@ pip3 install pexpect
|
|||||||
sudo apt-get install libopenjp2-7
|
sudo apt-get install libopenjp2-7
|
||||||
sudo apt-get install libtiff5
|
sudo apt-get install libtiff5
|
||||||
|
|
||||||
chmod ugo+rwx final.ppm
|
chmod ugo+rwx display_images/*
|
||||||
chmod ugo+rwx final1.ppm
|
|
||||||
chmod ugo+rwx scroll_text.ppm
|
|
||||||
chmod ugo+rwx display_gif
|
|
||||||
chmod ugo+rwx display_image.ppm
|
|
||||||
chmod ugo+rwx weather.ppm
|
|
||||||
chmod ugo+rwx teams.ppm
|
|
||||||
chmod ugo+rwx league.ppm
|
|
||||||
chmod ugo+rwx full.ppm
|
|
||||||
|
|
||||||
cd rpi-rgb-led-matrix
|
cd rpi-rgb-led-matrix
|
||||||
sudo apt-get update && sudo apt-get install python3-dev python3-pillow -y
|
sudo apt-get update && sudo apt-get install python3-dev python3-pillow -y
|
||||||
make build-python PYTHON=$(which python3)
|
make build-python PYTHON=$(which python3)
|
||||||
@@ -27,5 +18,6 @@ sudo apt-get install libatlas-base-dev
|
|||||||
pip3 install pycoingecko
|
pip3 install pycoingecko
|
||||||
pip3 install newsapi-python
|
pip3 install newsapi-python
|
||||||
pip3 install pytz
|
pip3 install pytz
|
||||||
|
pip3 install matplotlib
|
||||||
|
|
||||||
sudo apt-get remove bluez bluez-firmware pi-bluetooth triggerhappy pigpio
|
sudo apt-get remove bluez bluez-firmware pi-bluetooth triggerhappy pigpio
|
||||||
|
|||||||
+329
-197
@@ -39,7 +39,7 @@ class StockTicker():
|
|||||||
|
|
||||||
self.greenORred = (255, 255, 255)
|
self.greenORred = (255, 255, 255)
|
||||||
#self.blank = Image.open('logos/blank.png')
|
#self.blank = Image.open('logos/blank.png')
|
||||||
self.blank = Image.new('RGB', (15, 32))
|
self.blank = Image.new('RGB', (10, 32))
|
||||||
self.running = True
|
self.running = True
|
||||||
self.brightness = 1.0
|
self.brightness = 1.0
|
||||||
self.delay = 0.02
|
self.delay = 0.02
|
||||||
@@ -110,9 +110,7 @@ class StockTicker():
|
|||||||
|
|
||||||
self.setImage(image, offset_x = offset_x, offset_y = offset_y)
|
self.setImage(image, offset_x = offset_x, offset_y = offset_y)
|
||||||
|
|
||||||
# remove the ppixels behind the image, to stop trailing
|
# remove the ppixels behind the image, to stop trailing
|
||||||
|
|
||||||
|
|
||||||
for x in range(offset_x + img_width, 128):
|
for x in range(offset_x + img_width, 128):
|
||||||
for y in range(self.matrix.height):
|
for y in range(self.matrix.height):
|
||||||
|
|
||||||
@@ -120,17 +118,7 @@ class StockTicker():
|
|||||||
self.matrix.SetPixel(x , y , 0,0,0)
|
self.matrix.SetPixel(x , y , 0,0,0)
|
||||||
|
|
||||||
|
|
||||||
try:
|
kill = self.checkKilled()
|
||||||
msg = getInput()
|
|
||||||
if msg == 'K':
|
|
||||||
self.resetMatrix()
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
self.process_msg(msg)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.stdout.flush()
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(self.delay)
|
time.sleep(self.delay)
|
||||||
return False
|
return False
|
||||||
@@ -146,20 +134,10 @@ class StockTicker():
|
|||||||
self.setImage(image, offset_x = offset_x+128, offset_y = offset_y)
|
self.setImage(image, offset_x = offset_x+128, offset_y = offset_y)
|
||||||
self.setImage(image, offset_x = offset_x, offset_y = offset_y+20)
|
self.setImage(image, offset_x = offset_x, offset_y = offset_y+20)
|
||||||
|
|
||||||
try:
|
kill = self.checkKilled()
|
||||||
msg = getInput()
|
|
||||||
if msg == 'K':
|
|
||||||
self.resetMatrix()
|
|
||||||
|
|
||||||
return True
|
|
||||||
|
|
||||||
self.process_msg(msg)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.stdout.flush()
|
|
||||||
pass
|
|
||||||
|
|
||||||
time.sleep(self.delay)
|
time.sleep(self.delay)
|
||||||
return False
|
return kill
|
||||||
|
|
||||||
def scrollImageTransition(self, image_files, offset_x = 0, offset_y = 0, stocks = True):
|
def scrollImageTransition(self, image_files, offset_x = 0, offset_y = 0, stocks = True):
|
||||||
# use two image files and switch between them with a seemless transition
|
# use two image files and switch between them with a seemless transition
|
||||||
@@ -199,20 +177,9 @@ class StockTicker():
|
|||||||
|
|
||||||
|
|
||||||
time.sleep(self.delay)
|
time.sleep(self.delay)
|
||||||
try:
|
kill = self.checkKilled()
|
||||||
msg = getInput()
|
if kill: break
|
||||||
|
|
||||||
if msg == 'K':
|
|
||||||
self.resetMatrix()
|
|
||||||
kill = True
|
|
||||||
image1.close()
|
|
||||||
image2.close()
|
|
||||||
break
|
|
||||||
|
|
||||||
self.process_msg(msg)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
sys.stdout.flush()
|
|
||||||
pass
|
|
||||||
if stocks:
|
if stocks:
|
||||||
image1.close()
|
image1.close()
|
||||||
image2.close()
|
image2.close()
|
||||||
@@ -226,7 +193,115 @@ class StockTicker():
|
|||||||
elif current_img == 2:
|
elif current_img == 2:
|
||||||
current_img = 1
|
current_img = 1
|
||||||
offset_x = 0
|
offset_x = 0
|
||||||
|
|
||||||
|
|
||||||
|
def updateMultiple(self, options):
|
||||||
|
|
||||||
|
for option in options:
|
||||||
|
print(option)
|
||||||
|
img = self.functions[option]()
|
||||||
|
img.save('display_images/' + option + '.ppm')
|
||||||
|
|
||||||
|
def checkKilled(self):
|
||||||
|
|
||||||
|
kill = False
|
||||||
|
try:
|
||||||
|
msg = getInput()
|
||||||
|
|
||||||
|
if msg == 'K':
|
||||||
|
self.resetMatrix()
|
||||||
|
kill = True
|
||||||
|
self.process_msg(msg)
|
||||||
|
except KeyboardInterrupt:
|
||||||
|
sys.stdout.flush()
|
||||||
|
pass
|
||||||
|
return kill
|
||||||
|
|
||||||
|
def scrollFunctionsAnimated(self, options, animation = 'continuous'):
|
||||||
|
# scrolls trhough all functions with animation. Updates functions and remakes images when each function not being dispplayed
|
||||||
|
self.updateMultiple(options)
|
||||||
|
|
||||||
|
print('done update')
|
||||||
|
kill = False
|
||||||
|
i = 0 # keep track of which image we are displaying
|
||||||
|
while True:
|
||||||
|
|
||||||
|
update_process = Process(target = self.updateMultiple, args = (options,))
|
||||||
|
update_process.start()
|
||||||
|
print('display_images/' + options[i % len(options)] +'.ppm')
|
||||||
|
|
||||||
|
image = self.openImage('display_images/' + options[i % len(options)] +'.ppm')
|
||||||
|
if animation == 'continuous':
|
||||||
|
image2 = self.openImage('display_images/' + options[(i + 1) % len(options)] +'.ppm')
|
||||||
|
|
||||||
|
img_width, img_height = image.size
|
||||||
|
offset_x = 0
|
||||||
|
if animation == 'traditional':
|
||||||
|
offset_x = 128
|
||||||
|
|
||||||
|
|
||||||
|
offset_y = 0
|
||||||
|
#first scroll image in from bottom
|
||||||
|
|
||||||
|
if animation == 'up':
|
||||||
|
offset_y = 32
|
||||||
|
while offset_y > 0:
|
||||||
|
|
||||||
|
self.setImage(image, offset_x = offset_x, offset_y = offset_y)
|
||||||
|
offset_y -= 1
|
||||||
|
|
||||||
|
time.sleep(self.delay)
|
||||||
|
kill = self.checkKilled()
|
||||||
|
if kill: break
|
||||||
|
|
||||||
|
elif animation == 'down':
|
||||||
|
offset_y = -32
|
||||||
|
while offset_y < 0:
|
||||||
|
|
||||||
|
self.setImage(image, offset_x = offset_x, offset_y = offset_y)
|
||||||
|
offset_y += 1
|
||||||
|
|
||||||
|
time.sleep(self.delay)
|
||||||
|
kill = self.checkKilled()
|
||||||
|
if kill: break
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
while offset_x > -img_width:
|
||||||
|
offset_x -= 1
|
||||||
|
|
||||||
|
|
||||||
|
# remove the ppixels behind the image, to stop trailing
|
||||||
|
for x in range(0,offset_x ):
|
||||||
|
for y in range(self.matrix.height):
|
||||||
|
|
||||||
|
|
||||||
|
self.matrix.SetPixel(x , y , 0,0,0)
|
||||||
|
self.setImage(image, offset_x = offset_x, offset_y = offset_y)
|
||||||
|
|
||||||
|
if animation == 'continuous':
|
||||||
|
if offset_x + img_width < self.matrix.width: # if the image is ending
|
||||||
|
self.setImage(image2, offset_x = offset_x + img_width, offset_y = offset_y)
|
||||||
|
else:
|
||||||
|
# remove the ppixels behind the image, to stop trailing
|
||||||
|
for x in range(offset_x + img_width, 128):
|
||||||
|
for y in range(self.matrix.height):
|
||||||
|
|
||||||
|
|
||||||
|
self.matrix.SetPixel(x , y , 0,0,0)
|
||||||
|
|
||||||
|
time.sleep(self.delay)
|
||||||
|
kill = self.checkKilled()
|
||||||
|
if kill: break
|
||||||
|
|
||||||
|
if kill: break
|
||||||
|
|
||||||
|
|
||||||
|
update_process.join()
|
||||||
|
i+=1
|
||||||
|
|
||||||
|
|
||||||
def textImage(self, text, font, r = 255, g = 255, b = 255, matrix_height = False, buff = 0):
|
def textImage(self, text, font, r = 255, g = 255, b = 255, matrix_height = False, buff = 0):
|
||||||
'''
|
'''
|
||||||
creates and returns a ppm image containing the text in the supplied font and colour
|
creates and returns a ppm image containing the text in the supplied font and colour
|
||||||
@@ -236,14 +311,14 @@ class StockTicker():
|
|||||||
|
|
||||||
if matrix_height:
|
if matrix_height:
|
||||||
height = 32
|
height = 32
|
||||||
img = Image.new('RGB', (width + buff + 3, height+5))
|
img = Image.new('RGB', (width + buff + 3, height+3))
|
||||||
d = ImageDraw.Draw(img)
|
d = ImageDraw.Draw(img)
|
||||||
|
|
||||||
d.text((0, 0), text, fill=(r, g, b), font=font)
|
d.text((0, 0), text, fill=(r, g, b), font=font)
|
||||||
return img
|
return img
|
||||||
|
|
||||||
|
|
||||||
def displayUserText(self):
|
def getUserText(self):
|
||||||
'''
|
'''
|
||||||
displays the text entered in the webpage by the user.
|
displays the text entered in the webpage by the user.
|
||||||
'''
|
'''
|
||||||
@@ -259,73 +334,66 @@ class StockTicker():
|
|||||||
font = ImageFont.load("./fonts/texgyre-27.pil")
|
font = ImageFont.load("./fonts/texgyre-27.pil")
|
||||||
|
|
||||||
img = self.textImage(text, font, int(r), int(g), int(b), True, buff = 50)
|
img = self.textImage(text, font, int(r), int(g), int(b), True, buff = 50)
|
||||||
|
return img
|
||||||
|
|
||||||
img.save('scroll_text.ppm')
|
|
||||||
self.scrollImageTransition(['scroll_text.ppm', 'scroll_text.ppm'], offset_x = 128, offset_y = 0, stocks = False)
|
|
||||||
|
|
||||||
def displayNews(self):
|
def getNewsImage(self):
|
||||||
headline_font = ImageFont.load("./fonts/10x20.pil")
|
headline_font = ImageFont.load("./fonts/10x20.pil")
|
||||||
source_font = ImageFont.load("./fonts/10x20.pil")
|
source_font = ImageFont.load("./fonts/10x20.pil")
|
||||||
while True:
|
|
||||||
headlines = []
|
image_list = []
|
||||||
source_date_times = []
|
|
||||||
|
headlines = []
|
||||||
|
source_date_times = []
|
||||||
|
|
||||||
|
f = open('csv/news.csv', 'r')
|
||||||
|
CSV = csv.reader(f)
|
||||||
|
next(CSV)
|
||||||
|
for row in CSV:
|
||||||
|
headline, source, date, time = row
|
||||||
|
headlines.append(headline)
|
||||||
|
source_date_times.append(source + ': ' + date + ' ' + time)
|
||||||
|
|
||||||
f = open('csv/news.csv', 'r')
|
f.close()
|
||||||
CSV = csv.reader(f)
|
|
||||||
next(CSV)
|
|
||||||
for row in CSV:
|
|
||||||
headline, source, date, time = row
|
|
||||||
headlines.append(headline)
|
|
||||||
source_date_times.append(source + ': ' + date + ' ' + time)
|
|
||||||
|
|
||||||
f.close()
|
|
||||||
|
|
||||||
if len(headlines) > 0:
|
|
||||||
|
|
||||||
for i, headline in enumerate(headlines):
|
|
||||||
headline = headline.replace("^", ",")
|
|
||||||
headline = headline.replace("’", "'")
|
|
||||||
headline = headline.replace("‘", "'")
|
|
||||||
headline = headline.replace('“', '"')
|
|
||||||
headline = headline.replace('”', '"')
|
|
||||||
|
|
||||||
headline_img = self.textImage(headline, headline_font, matrix_height = True)
|
|
||||||
source_img = self.textImage(source_date_times[i], source_font, r=255, g=255, b=0, matrix_height = True)
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
logos_path = os.path.join(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos'), 'news_logos')
|
|
||||||
|
|
||||||
logo = Image.open(os.path.join(logos_path, 'techcrunch' + '.png'))
|
|
||||||
|
|
||||||
img = Image.new('RGB', (headline_img.size[0], 32))
|
|
||||||
img.paste(headline_img, (2, -3))
|
|
||||||
img.paste(source_img, (2,16))
|
|
||||||
|
|
||||||
img= self.stitchImage([logo,img])
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(e)
|
|
||||||
img = Image.new('RGB', (headline_img.size[0], 32))
|
|
||||||
img.paste(headline_img, (0,0))
|
|
||||||
img.paste(source_img, (0,16))
|
|
||||||
img.save('image.ppm')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
killed = self.scrollImage(img, offset_x = 128, offset_y = 0)
|
|
||||||
#killed = self.scrollImageStacked(img, offset_x = 128, offset_y = 0)
|
|
||||||
if killed: break
|
|
||||||
|
|
||||||
else:
|
|
||||||
print('new failed')
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if killed: break
|
|
||||||
|
|
||||||
|
|
||||||
|
for i, headline in enumerate(headlines):
|
||||||
|
headline = headline.replace("^", ",")
|
||||||
|
headline = headline.replace("’", "'")
|
||||||
|
headline = headline.replace("‘", "'")
|
||||||
|
headline = headline.replace('“', '"')
|
||||||
|
headline = headline.replace('”', '"')
|
||||||
|
|
||||||
|
headline_img = self.textImage(headline, headline_font, matrix_height = True)
|
||||||
|
source_img = self.textImage(source_date_times[i], source_font, r=255, g=255, b=0, matrix_height = True)
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
logos_path = os.path.join(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos'), 'news_logos')
|
||||||
|
|
||||||
|
logo = Image.open(os.path.join(logos_path, 'techcrunch' + '.png'))
|
||||||
|
|
||||||
|
img = Image.new('RGB', (headline_img.size[0], 32))
|
||||||
|
img.paste(headline_img, (2, -3))
|
||||||
|
img.paste(source_img, (2,16))
|
||||||
|
|
||||||
|
img= self.stitchImage([logo,img])
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
img = Image.new('RGB', (headline_img.size[0], 32))
|
||||||
|
img.paste(headline_img, (0,0))
|
||||||
|
img.paste(source_img, (0,16))
|
||||||
|
|
||||||
|
image_list.append(img)
|
||||||
|
|
||||||
|
news_image = self.stitchImage(image_list)
|
||||||
|
|
||||||
|
return news_image
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def displayGIF(self, gif):
|
def displayGIF(self, gif):
|
||||||
# To iterate through the entire gif
|
# To iterate through the entire gif
|
||||||
i = 0
|
i = 0
|
||||||
@@ -429,7 +497,8 @@ class StockTicker():
|
|||||||
def textToImage(self, TICKER, CURRENT, CHANGE, ARROW):
|
def textToImage(self, TICKER, CURRENT, CHANGE, ARROW):
|
||||||
font = ImageFont.load("./fonts/10x20.pil")
|
font = ImageFont.load("./fonts/10x20.pil")
|
||||||
text_width_current, text_height = self.get_text_dimensions(CURRENT, font)
|
text_width_current, text_height = self.get_text_dimensions(CURRENT, font)
|
||||||
img = Image.new('RGB', (text_width_current + 100, 32))
|
|
||||||
|
img = Image.new('RGB', (text_width_current +100 , 32))
|
||||||
d = ImageDraw.Draw(img)
|
d = ImageDraw.Draw(img)
|
||||||
|
|
||||||
d.text((4, 0), TICKER, fill=(255, 255, 255), font=font)
|
d.text((4, 0), TICKER, fill=(255, 255, 255), font=font)
|
||||||
@@ -442,9 +511,9 @@ class StockTicker():
|
|||||||
|
|
||||||
text_width_change, text_height = self.get_text_dimensions(CHANGE, font)
|
text_width_change, text_height = self.get_text_dimensions(CHANGE, font)
|
||||||
|
|
||||||
newWidth = (text_width_current+29) + (text_width_change)
|
newWidth = text_width_current + text_width_change +30
|
||||||
|
|
||||||
img.crop((0,0,newWidth,32))
|
img = img.crop((0,0,newWidth,32))
|
||||||
return img
|
return img
|
||||||
|
|
||||||
#Stitch the logo & prices picture into one image
|
#Stitch the logo & prices picture into one image
|
||||||
@@ -467,43 +536,19 @@ class StockTicker():
|
|||||||
|
|
||||||
|
|
||||||
self.matrix.SetPixel(x , y , 0,0,0)
|
self.matrix.SetPixel(x , y , 0,0,0)
|
||||||
|
|
||||||
#Connect all the pieces togeather creating 1 long final stock image
|
|
||||||
def getFullStockImage(self, updated_img):
|
def getCryptoImage(self):
|
||||||
|
font = ImageFont.load("./fonts/texgyre-27.pil")
|
||||||
image_list = []
|
title_img = self.textImage('CRYPTO', font, matrix_height = True)
|
||||||
|
image_list = [title_img]
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
start = time.time()
|
start = time.time()
|
||||||
self.readCSV()
|
self.readCryptoCSV()
|
||||||
|
|
||||||
|
|
||||||
for i, symbol in enumerate(self.symbols):
|
|
||||||
info = self.stock_info[symbol]
|
|
||||||
|
|
||||||
change = float(info[0])-float(info[1]) #TEXT
|
|
||||||
ticker = symbol #TEXT
|
|
||||||
current = '%.2f' % float(info[0]) #TEXT
|
|
||||||
|
|
||||||
arrow, change = self.getArrow(change)
|
|
||||||
change = '%.2f' % change
|
|
||||||
midFrame = self.textToImage(ticker, current, change, arrow) #IMAGE THE TEXT
|
|
||||||
|
|
||||||
|
|
||||||
try:
|
|
||||||
logos_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos')
|
|
||||||
|
|
||||||
logo = Image.open(os.path.join(logos_path, ticker + '.png'))
|
|
||||||
stitchedStock = self.stitchImage([logo,midFrame])
|
|
||||||
except:
|
|
||||||
|
|
||||||
stitchedStock = midFrame
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
image_list.append(self.blank)
|
|
||||||
image_list.append(stitchedStock)
|
|
||||||
|
|
||||||
for i, coin in enumerate(self.coins):
|
for i, coin in enumerate(self.coins):
|
||||||
|
|
||||||
info = self.coin_info[coin]
|
info = self.coin_info[coin]
|
||||||
|
|
||||||
change = float(info[3]) #TEXT
|
change = float(info[3]) #TEXT
|
||||||
@@ -532,13 +577,29 @@ class StockTicker():
|
|||||||
|
|
||||||
stitchedStock = midFrame
|
stitchedStock = midFrame
|
||||||
|
|
||||||
image_list.append(self.blank)
|
|
||||||
image_list.append(stitchedStock)
|
image_list.append(stitchedStock)
|
||||||
|
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
finalDisplayImage = self.stitchImage(image_list)
|
||||||
|
|
||||||
|
return finalDisplayImage
|
||||||
|
|
||||||
|
def getForexImage(self):
|
||||||
|
font = ImageFont.load("./fonts/texgyre-27.pil")
|
||||||
|
title_img = self.textImage('FOREX', font, matrix_height = True)
|
||||||
|
image_list = [title_img]
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
base, currency_info = json.load(open('csv/currency.json', 'r'))
|
base, currency_info = json.load(open('csv/currency.json', 'r'))
|
||||||
|
currencies = ['AUD', 'CAD', 'CHF', 'EUR', 'GBP', 'JPY', 'NZD']
|
||||||
|
|
||||||
for i, currency in enumerate(['AUD', 'CAD', 'CHF', 'EUR', 'GBP', 'JPY', 'NZD']):
|
for i, currency in enumerate(currencies):
|
||||||
|
|
||||||
current, yesterday = currency_info[currency]
|
current, yesterday = currency_info[currency]
|
||||||
|
|
||||||
@@ -561,28 +622,76 @@ class StockTicker():
|
|||||||
|
|
||||||
new_im = Image.new('RGB', (32, 32))
|
new_im = Image.new('RGB', (32, 32))
|
||||||
|
|
||||||
for im in image_list:
|
|
||||||
|
new_im.paste(bse, (0,10), bse.convert('RGBA'))
|
||||||
new_im.paste(bse, (0,10), bse.convert('RGBA'))
|
new_im.paste(logo, (10,0), logo.convert('RGBA'))
|
||||||
new_im.paste(logo, (10,0), logo.convert('RGBA'))
|
|
||||||
|
|
||||||
stitchedStock = self.stitchImage([new_im, midFrame])
|
stitchedStock = self.stitchImage([new_im, midFrame])
|
||||||
|
image_list.append(new_im)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(e)
|
||||||
|
|
||||||
|
image_list.append(midFrame)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
|
print('image', len(image_list))
|
||||||
|
|
||||||
|
finalDisplayImage = self.stitchImage(image_list)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
return finalDisplayImage
|
||||||
|
#Connect all the pieces togeather creating 1 long final stock image
|
||||||
|
def getStockImage(self):
|
||||||
|
font = ImageFont.load("./fonts/texgyre-27.pil")
|
||||||
|
title_img = self.textImage('STOCKS', font, matrix_height = True)
|
||||||
|
image_list = [title_img]
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
|
start = time.time()
|
||||||
|
self.readStocksCSV()
|
||||||
|
|
||||||
|
|
||||||
|
for i, symbol in enumerate(self.symbols):
|
||||||
|
|
||||||
|
|
||||||
|
info = self.stock_info[symbol]
|
||||||
|
|
||||||
|
change = float(info[0])-float(info[1]) #TEXT
|
||||||
|
ticker = symbol #TEXT
|
||||||
|
current = '%.2f' % float(info[0]) #TEXT
|
||||||
|
|
||||||
|
arrow, change = self.getArrow(change)
|
||||||
|
change = '%.2f' % change
|
||||||
|
midFrame = self.textToImage(ticker, current, change, arrow) #IMAGE THE TEXT
|
||||||
|
|
||||||
|
|
||||||
|
try:
|
||||||
|
logos_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'logos')
|
||||||
|
|
||||||
|
logo = Image.open(os.path.join(logos_path, ticker + '.png'))
|
||||||
|
stitchedStock = self.stitchImage([logo,midFrame])
|
||||||
except:
|
except:
|
||||||
|
|
||||||
stitchedStock = midFrame
|
stitchedStock = midFrame
|
||||||
|
|
||||||
|
|
||||||
image_list.append(self.blank)
|
|
||||||
image_list.append(stitchedStock)
|
image_list.append(stitchedStock)
|
||||||
|
|
||||||
|
|
||||||
|
image_list.append(self.blank)
|
||||||
|
|
||||||
|
|
||||||
finalDisplayImage = self.stitchImage(image_list)
|
finalDisplayImage = self.stitchImage(image_list)
|
||||||
|
|
||||||
if updated_img == 1:
|
|
||||||
finalDisplayImage.save('final.ppm')
|
|
||||||
elif updated_img == 2:
|
|
||||||
finalDisplayImage.save('final1.ppm')
|
|
||||||
|
|
||||||
return finalDisplayImage
|
return finalDisplayImage
|
||||||
|
|
||||||
@@ -657,41 +766,50 @@ class StockTicker():
|
|||||||
#img.paste(vs_timage, (x_offset, 12))
|
#img.paste(vs_timage, (x_offset, 12))
|
||||||
|
|
||||||
h_colour = mcolors.to_rgb(sports_info[home_team]['colour'].replace(' ', ''))
|
h_colour = mcolors.to_rgb(sports_info[home_team]['colour'].replace(' ', ''))
|
||||||
|
|
||||||
hc_timage = self.textImage(sports_info[home_team]['code'], med_font, r = int(h_colour[0]*255), g = int(h_colour[1]*255), b = int(h_colour[2]*255))
|
|
||||||
|
|
||||||
a_colour = mcolors.to_rgb(sports_info[away_team]['colour'].replace(' ', ''))
|
a_colour = mcolors.to_rgb(sports_info[away_team]['colour'].replace(' ', ''))
|
||||||
|
|
||||||
ac_timage = self.textImage(sports_info[away_team]['code'], med_font, r = int(a_colour[0]*255), g = int(a_colour[1]*255), b = int(a_colour[2]*255))
|
|
||||||
|
|
||||||
|
hc_timage = self.textImage(sports_info[home_team]['code'], med_font, r = int(h_colour[0]*255), g = int(h_colour[1]*255), b = int(h_colour[2]*255))
|
||||||
|
ac_timage = self.textImage(sports_info[away_team]['code'], med_font, r = int(a_colour[0]*255), g = int(a_colour[1]*255), b = int(a_colour[2]*255))
|
||||||
vs_timage = self.textImage('vs', med_font, r = 255, g = 255, b = 255)
|
vs_timage = self.textImage('vs', med_font, r = 255, g = 255, b = 255)
|
||||||
|
|
||||||
img.paste(hc_timage, (x_offset, 9))
|
img.paste(hc_timage, (x_offset, 9))
|
||||||
img.paste(vs_timage, (x_offset + hc_timage.size[0], 9))
|
img.paste(vs_timage, (x_offset + hc_timage.size[0], 9))
|
||||||
img.paste(ac_timage, (x_offset + hc_timage.size[0] + vs_timage.size[0], 9))
|
img.paste(ac_timage, (x_offset + hc_timage.size[0] + vs_timage.size[0], 9))
|
||||||
|
x_offset += max( date_timage.size[0], hc_timage.size[0] + vs_timage.size[0] + ac_timage.size[0])
|
||||||
else:
|
else:
|
||||||
|
|
||||||
img.paste(date_timage, (x_offset+10, 0))
|
|
||||||
|
|
||||||
score_image = self.textImage(home_score + '-' + away_score, large_font, r = 255, g = 255, b = 255)
|
score_image = self.textImage(home_score + '-' + away_score, large_font, r = 255, g = 255, b = 255)
|
||||||
|
|
||||||
#vs_timage = self.textImage(sports_info[home_team]['code'] + 'vs' + sports_info[away_team]['code'], small_font, r = 255, g = 255, b = 255)
|
#vs_timage = self.textImage(sports_info[home_team]['code'] + 'vs' + sports_info[away_team]['code'], small_font, r = 255, g = 255, b = 255)
|
||||||
|
|
||||||
h_colour = mcolors.to_rgb(sports_info[home_team]['colour'].replace(' ', ''))
|
h_colour = mcolors.to_rgb(sports_info[home_team]['colour'].replace(' ', ''))
|
||||||
|
|
||||||
hc_timage = self.textImage(sports_info[home_team]['code'], small_font, r = int(h_colour[0]*255), g = int(h_colour[1]*255), b = int(h_colour[2]*255))
|
|
||||||
|
|
||||||
a_colour = mcolors.to_rgb(sports_info[away_team]['colour'].replace(' ', ''))
|
a_colour = mcolors.to_rgb(sports_info[away_team]['colour'].replace(' ', ''))
|
||||||
|
|
||||||
|
hc_timage = self.textImage(sports_info[home_team]['code'], small_font, r = int(h_colour[0]*255), g = int(h_colour[1]*255), b = int(h_colour[2]*255))
|
||||||
ac_timage = self.textImage(sports_info[away_team]['code'], small_font, r = int(a_colour[0]*255), g = int(a_colour[1]*255), b = int(a_colour[2]*255))
|
ac_timage = self.textImage(sports_info[away_team]['code'], small_font, r = int(a_colour[0]*255), g = int(a_colour[1]*255), b = int(a_colour[2]*255))
|
||||||
|
|
||||||
vs_timage = self.textImage('vs', small_font, r = 255, g = 255, b = 255)
|
vs_timage = self.textImage('vs', small_font, r = 255, g = 255, b = 255)
|
||||||
|
|
||||||
img.paste(hc_timage, (x_offset+14, 9))
|
if date_timage.size[0] > score_image.size[0]:
|
||||||
img.paste(vs_timage, (x_offset+13 + hc_timage.size[0], 9))
|
img.paste(date_timage, (x_offset+2, 0))
|
||||||
img.paste(ac_timage, (x_offset+14 + hc_timage.size[0] + vs_timage.size[0], 9))
|
img.paste(hc_timage, (x_offset+6, 9))
|
||||||
|
img.paste(vs_timage, (x_offset+5 + hc_timage.size[0], 9))
|
||||||
|
img.paste(ac_timage, (x_offset+6 + hc_timage.size[0] + vs_timage.size[0], 9))
|
||||||
|
img.paste(score_image, (x_offset + 2 + int((date_timage.size[0] - score_image.size[0])/2), 15))
|
||||||
|
else:
|
||||||
|
|
||||||
|
img.paste(date_timage, (x_offset+1+int((score_image.size[0] - date_timage.size[0] )/2), 0))
|
||||||
|
vs_size = hc_timage.size[0] + vs_timage.size[0] + ac_timage.size[0]
|
||||||
|
img.paste(hc_timage, (x_offset + 1 + int((score_image.size[0] - vs_size)/2), 9))
|
||||||
|
img.paste(vs_timage, (x_offset + int((score_image.size[0] - vs_size)/2) + hc_timage.size[0], 9))
|
||||||
|
img.paste(ac_timage, (x_offset+1 + int((score_image.size[0] - vs_size)/2) + hc_timage.size[0] + vs_timage.size[0], 9))
|
||||||
|
|
||||||
|
img.paste(score_image, (x_offset+1, 15))
|
||||||
|
|
||||||
|
|
||||||
img.paste(score_image, (x_offset + 35 - int(score_image.size[0]/2), 15))
|
x_offset += max( date_timage.size[0]+4, hc_timage.size[0] + vs_timage.size[0] + ac_timage.size[0]+4, 2 + int(score_image.size[0]))
|
||||||
|
|
||||||
#img.paste(vs_timage, (x_offset+4, 9))
|
#img.paste(vs_timage, (x_offset+4, 9))
|
||||||
|
|
||||||
@@ -704,13 +822,11 @@ class StockTicker():
|
|||||||
|
|
||||||
|
|
||||||
#x_offset += max(home_timage.size[0], away_timage.size[0], date_timage.size[0], round_timage.size[0], score_image.size[0])
|
#x_offset += max(home_timage.size[0], away_timage.size[0], date_timage.size[0], round_timage.size[0], score_image.size[0])
|
||||||
if time == 'future':
|
|
||||||
x_offset += max( date_timage.size[0], hc_timage.size[0] + vs_timage.size[0] + ac_timage.size[0])
|
|
||||||
else:
|
|
||||||
|
|
||||||
x_offset += max( date_timage.size[0]+10, hc_timage.size[0] + vs_timage.size[0] + ac_timage.size[0]+14, 35 + int(score_image.size[0]/2))
|
|
||||||
|
|
||||||
img.paste(away_logo, (x_offset+2,0))
|
img.paste(away_logo, (x_offset,0))
|
||||||
|
|
||||||
x_offset += away_logo.size[0]
|
x_offset += away_logo.size[0]
|
||||||
x_offset += buff_size
|
x_offset += buff_size
|
||||||
@@ -1018,7 +1134,7 @@ class StockTicker():
|
|||||||
|
|
||||||
img1 = img.crop((64,0,x_offset ,32))
|
img1 = img.crop((64,0,x_offset ,32))
|
||||||
|
|
||||||
img1.save('weather.ppm')
|
img1.save('display_images/weather.ppm')
|
||||||
|
|
||||||
return img0, img1
|
return img0, img1
|
||||||
|
|
||||||
@@ -1203,7 +1319,7 @@ class StockTicker():
|
|||||||
|
|
||||||
|
|
||||||
#Retrieve symbols and stock info from the csv file
|
#Retrieve symbols and stock info from the csv file
|
||||||
def readCSV(self):
|
def readStocksCSV(self):
|
||||||
|
|
||||||
self.symbols = []
|
self.symbols = []
|
||||||
self.stock_info = {}
|
self.stock_info = {}
|
||||||
@@ -1221,6 +1337,7 @@ class StockTicker():
|
|||||||
|
|
||||||
f.close()
|
f.close()
|
||||||
|
|
||||||
|
def readCryptoCSV(self):
|
||||||
self.coins = []
|
self.coins = []
|
||||||
self.coin_info = {}
|
self.coin_info = {}
|
||||||
f = open('csv/crypto.csv', 'r')
|
f = open('csv/crypto.csv', 'r')
|
||||||
@@ -1300,11 +1417,19 @@ class StockTicker():
|
|||||||
def process_msg(self, msg):
|
def process_msg(self, msg):
|
||||||
|
|
||||||
if msg == 'S': # stocks
|
if msg == 'S': # stocks
|
||||||
self.getFullStockImage(1)
|
img = self.getStockImage()
|
||||||
self.displayStocks()
|
|
||||||
|
|
||||||
|
img.save('display_images/stocks.ppm')
|
||||||
|
self.scrollImageTransition(['display_images/stocks.ppm', 'display_images/stocks.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'N': #news
|
elif msg == 'N': #news
|
||||||
self.displayNews()
|
img = self.getNewsImage()
|
||||||
|
|
||||||
|
|
||||||
|
img.save('display_images/news.ppm')
|
||||||
|
self.scrollImageTransition(['display_images/news.ppm', 'display_images/news.ppm'], stocks = False)
|
||||||
|
|
||||||
# speed settings
|
# speed settings
|
||||||
elif msg == 's':
|
elif msg == 's':
|
||||||
self.delay = 0.03
|
self.delay = 0.03
|
||||||
@@ -1323,11 +1448,14 @@ class StockTicker():
|
|||||||
|
|
||||||
elif msg == 'T':# text
|
elif msg == 'T':# text
|
||||||
|
|
||||||
self.displayUserText()
|
img = self.getUserText()
|
||||||
|
|
||||||
|
img.save('display_images/scroll_text.ppm')
|
||||||
|
self.scrollImageTransition(['display_images/scroll_text.ppm', 'display_images/scroll_text.ppm'], offset_x = 128, offset_y = 0, stocks = False)
|
||||||
|
|
||||||
elif msg == 'I': # image
|
elif msg == 'I': # image
|
||||||
|
|
||||||
image = self.openImage(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'display_image'))
|
image = self.openImage(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'display_images/display_image'))
|
||||||
|
|
||||||
#self.setImage( image)
|
#self.setImage( image)
|
||||||
while True:
|
while True:
|
||||||
@@ -1337,7 +1465,7 @@ class StockTicker():
|
|||||||
break
|
break
|
||||||
|
|
||||||
elif msg == 'G': # gif
|
elif msg == 'G': # gif
|
||||||
gif = Image.open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'display_gif'))
|
gif = Image.open(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'display_images/display_gif'))
|
||||||
#self.displayGIF(gif)
|
#self.displayGIF(gif)
|
||||||
while True:
|
while True:
|
||||||
kill = self.scrollGIF(gif, offset_x = 128)
|
kill = self.scrollGIF(gif, offset_x = 128)
|
||||||
@@ -1346,50 +1474,51 @@ class StockTicker():
|
|||||||
|
|
||||||
elif msg == 'W': # weather
|
elif msg == 'W': # weather
|
||||||
img = self.getTodayWeatherImage()
|
img = self.getTodayWeatherImage()
|
||||||
img.save('weather.ppm')
|
img.save('display_images/weather.ppm')
|
||||||
self.scrollImageTransition(['weather.ppm', 'weather.ppm'], stocks = False)
|
self.scrollImageTransition(['display_images/weather.ppm', 'display_images/weather.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'D': # daily weather
|
elif msg == 'D': # daily weather
|
||||||
#self.displayDailyWeatherAlt()
|
#self.displayDailyWeatherAlt()
|
||||||
|
|
||||||
img = self.getDailyWeatherImage()
|
img = self.getDailyWeatherImage()
|
||||||
img.save('weather.ppm')
|
img.save('display_images/weather.ppm')
|
||||||
#self.setImage( image)
|
#self.setImage( image)
|
||||||
self.scrollImageTransition(['weather.ppm', 'weather.ppm'], stocks = False)
|
self.scrollImageTransition(['display_images/weather.ppm', 'display_images/weather.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'P': # past league
|
elif msg == 'P': # past league
|
||||||
img = self.getLeagueImage('premier_league', 'past')
|
img = self.getLeagueImage('NBA', 'past')
|
||||||
img.save('league.ppm')
|
img.save('display_images/league.ppm')
|
||||||
|
|
||||||
stock_ticker.scrollImageTransition(['league.ppm', 'league.ppm'], stocks = False)
|
stock_ticker.scrollImageTransition(['display_images/league.ppm', 'display_images/league.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'F': # future league
|
elif msg == 'F': # future league
|
||||||
img = self.getLeagueImage('NBA', 'future')
|
img = self.getLeagueImage('NHL', 'future')
|
||||||
img.save('league.ppm')
|
img.save('display_images/league.ppm')
|
||||||
|
|
||||||
stock_ticker.scrollImageTransition(['league.ppm', 'league.ppm'], stocks = False)
|
stock_ticker.scrollImageTransition(['display_images/league.ppm', 'display_images/league.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'L': # live game
|
elif msg == 'L': # live game
|
||||||
img = self.getLeagueImage('NBA', 'live')
|
img = self.getLeagueImage('NBA', 'live')
|
||||||
img.save('league.ppm')
|
img.save('display_images/league.ppm')
|
||||||
|
|
||||||
stock_ticker.scrollImageTransition(['league.ppm', 'league.ppm'], stocks = False)
|
stock_ticker.scrollImageTransition(['display_images/league.ppm', 'display_images/league.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 't': #teams
|
elif msg == 't': #teams
|
||||||
img = self.getTeamsImage('premier_league')
|
img = self.getTeamsImage('premier_league')
|
||||||
img.save('teams.ppm')
|
img.save('display_images/teams.ppm')
|
||||||
|
|
||||||
stock_ticker.scrollImageTransition(['teams.ppm', 'teams.ppm'], stocks = False)
|
stock_ticker.scrollImageTransition(['display_images/teams.ppm', 'display_images/teams.ppm'], stocks = False)
|
||||||
|
|
||||||
elif msg == 'A': #everything
|
elif msg == 'A': #everything
|
||||||
stock_img = self.getFullStockImage(1)
|
|
||||||
weather_img = self.getTodayWeatherImage()
|
|
||||||
past_img = self.getLeagueImage('NBA', 'past')
|
|
||||||
future_img = img = self.getLeagueImage('NBA', 'future')
|
|
||||||
|
|
||||||
overall_img = self.stitchImage([stock_img, weather_img, past_img, future_img])
|
self.functions = {'stocks': self.getStockImage, 'crypto': self.getCryptoImage, 'forex': self.getForexImage,
|
||||||
overall_img.save('full.ppm')
|
'weather':self.getDailyWeatherImage} #put this somewhere else
|
||||||
self.scrollImageTransition(['full.ppm', 'full.ppm'], stocks = False)
|
|
||||||
|
userSettings = ['stocks', 'crypto', 'forex'] # these wil be read from csv, just for demo
|
||||||
|
#userSettings = ['stocks', 'crypto'] # these wil be read from csv, just for demo
|
||||||
|
#userSettings = [ 'forex', 'weather'] # these wil be read from csv, just for demo
|
||||||
|
|
||||||
|
self.scrollFunctionsAnimated(userSettings, animation = 'down')
|
||||||
|
|
||||||
elif msg == 'K': # kill
|
elif msg == 'K': # kill
|
||||||
self.resetMatrix()
|
self.resetMatrix()
|
||||||
@@ -1399,7 +1528,10 @@ if __name__ == '__main__':
|
|||||||
with open('log.txt', "w") as log:
|
with open('log.txt', "w") as log:
|
||||||
try:
|
try:
|
||||||
stock_ticker = StockTicker()
|
stock_ticker = StockTicker()
|
||||||
|
|
||||||
|
#stock_ticker.process_msg('P')
|
||||||
|
#stock_ticker.process_msg('A')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
BIN
Binary file not shown.
Reference in New Issue
Block a user