transition animations added and sports tidied up
This commit is contained in:
@@ -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'
|
||||||
|
|
||||||
|
@@ -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 @@
|
|||||||
["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 @@
|
|||||||
21/06/2021 12:41:07
|
22/06/2021 15:05:29
|
||||||
|
|
40
csv/news.csv
40
csv/news.csv
@@ -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"}]
|
@@ -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
|
||||||
|
|
BIN
display_images/crypto.ppm
Executable file
BIN
display_images/crypto.ppm
Executable file
Binary file not shown.
Before Width: | Height: | Size: 821 B After Width: | Height: | Size: 821 B |
0
display_image → display_images/display_image
Normal file → Executable file
0
display_image → display_images/display_image
Normal file → Executable file
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 |
BIN
display_images/forex.ppm
Executable file
BIN
display_images/forex.ppm
Executable file
Binary file not shown.
BIN
display_images/league.ppm
Executable file
BIN
display_images/league.ppm
Executable file
Binary file not shown.
BIN
display_images/news.ppm
Executable file
BIN
display_images/news.ppm
Executable file
Binary file not shown.
BIN
display_images/stocks.ppm
Executable file
BIN
display_images/stocks.ppm
Executable file
Binary file not shown.
BIN
display_images/weather.ppm
Executable file
BIN
display_images/weather.ppm
Executable file
Binary file not shown.
BIN
league.ppm
BIN
league.ppm
Binary file not shown.
12
setup.sh
12
setup.sh
@@ -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
|
||||||
|
494
stockTicker.py
494
stockTicker.py
@@ -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
|
||||||
@@ -111,8 +111,6 @@ 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()
|
||||||
@@ -227,6 +194,114 @@ class StockTicker():
|
|||||||
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,70 +334,63 @@ 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 = []
|
|
||||||
source_date_times = []
|
|
||||||
|
|
||||||
f = open('csv/news.csv', 'r')
|
image_list = []
|
||||||
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()
|
headlines = []
|
||||||
|
source_date_times = []
|
||||||
|
|
||||||
if len(headlines) > 0:
|
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)
|
||||||
|
|
||||||
for i, headline in enumerate(headlines):
|
f.close()
|
||||||
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)
|
for i, headline in enumerate(headlines):
|
||||||
#killed = self.scrollImageStacked(img, offset_x = 128, offset_y = 0)
|
headline = headline.replace("^", ",")
|
||||||
if killed: break
|
headline = headline.replace("’", "'")
|
||||||
|
headline = headline.replace("‘", "'")
|
||||||
|
headline = headline.replace('“', '"')
|
||||||
|
headline = headline.replace('”', '"')
|
||||||
|
|
||||||
else:
|
headline_img = self.textImage(headline, headline_font, matrix_height = True)
|
||||||
print('new failed')
|
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')
|
||||||
|
|
||||||
if killed: break
|
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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -468,42 +537,18 @@ 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):
|
|
||||||
|
|
||||||
image_list = []
|
def getCryptoImage(self):
|
||||||
|
font = ImageFont.load("./fonts/texgyre-27.pil")
|
||||||
|
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(stitchedStock)
|
||||||
|
|
||||||
|
|
||||||
image_list.append(self.blank)
|
image_list.append(self.blank)
|
||||||
image_list.append(stitchedStock)
|
|
||||||
|
|
||||||
|
|
||||||
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(score_image, (x_offset + 35 - int(score_image.size[0]/2), 15))
|
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))
|
||||||
|
|
||||||
|
|
||||||
|
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()
|
||||||
@@ -1400,6 +1529,9 @@ if __name__ == '__main__':
|
|||||||
try:
|
try:
|
||||||
stock_ticker = StockTicker()
|
stock_ticker = StockTicker()
|
||||||
|
|
||||||
|
#stock_ticker.process_msg('P')
|
||||||
|
#stock_ticker.process_msg('A')
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
BIN
weather.ppm
BIN
weather.ppm
Binary file not shown.
Reference in New Issue
Block a user