Napisałem krótki program do odczytu z api binane cen czterech krypto. Oprócz odczytu program ma zmieniać kolor czcionki w przypadku skoku wyżej kolor czcionki powinien zmienić się na zielony, a w przypadku spadku na czerwony. Wszystko zapisywane jest do sqlite, po odczycie z bazy ceny są aktualizowane na bieżąco, niestety kolory czcionek już nie. Jak sobie z tym poradzić? Nie mam jeszcze wiedzy na ten temat.
kod programu:
import json
import requests
#import datetime as dt # dla obsługi daty i czasu
import tkinter as tk
import sqlite3
from time import strftime
class Application:
def __init__(self):
self.window = tk.Tk()
# %% deklaracja zmiennych
self.btcUsd = tk.StringVar()
self.ethUsd = tk.StringVar()
self.dashUsd = tk.StringVar()
self.ltcUsd = tk.StringVar()
self.btcSql = tk.StringVar()
self.ethSql = tk.StringVar()
self.dashSql = tk.StringVar()
self.ltcSql = tk.StringVar()
self.kolorBtcOdczyt = tk.StringVar()
self.kolorEthOdczyt = tk.StringVar()
self.kolorDashOdczyt = tk.StringVar()
self.kolorLtcOdczyt = tk.StringVar()
self.dataOdczyt = tk.StringVar()
self.godzinaOdczyt = tk.StringVar()
self.btcOdczyt = tk.StringVar()
self.ethOdczyt = tk.StringVar()
self.dashOdczyt = tk.StringVar()
self.ltcOdczyt = tk.StringVar()
self.kryptoKolorBtc = tk.StringVar()
self.window.geometry("300x110+10+10")
self.window.configure(background="black")
self.window.title("Kryptowaluty - ceny USD")
self.krojCzcionki = "Comic Sans" # Times New Roman, Tahoma, Comic Sans
self.rozmiarCzcionki = 15
self.red = "red"
self.green = "green"
self.white = "white"
self.black = "black"
self.data = strftime("%d-%m-%Y")
self.godzina = strftime("%H:%M:%S")
# %% wywołanie definicji
self.baza_sql()
self.binance_krypto()
self.odczyt_sql()
# %% linie tekstowe
self.rama = tk.LabelFrame(self.window, padx=5, pady=5)
self.rama.configure(background="black")
self.rama.pack(fill="both", expand="yes")
# linia btc
self.liniaBtc = tk.Label(self.rama, text = "BTC:" , font = (self.krojCzcionki, self.rozmiarCzcionki, "bold"), bg="black", fg= "white").grid(row = 0, column = 0, sticky = "w")
self.liniaBtc0 = tk.Label(self.rama, textvariable = self.btcOdczyt, font = (self.krojCzcionki, self.rozmiarCzcionki), bg="black", fg = self.kolorBtcOdczyt.get()).grid(row = 0, column = 1, sticky="w")
# linia eth
self.liniaEth = tk.Label(self.rama, text = "ETH:" , font = (self.krojCzcionki, self.rozmiarCzcionki, "bold"), bg="black", fg= "white").grid(row = 1, column = 0, sticky = "w")
self.liniaEth0 = tk.Label(self.rama, textvariable = self.ethOdczyt, font = (self.krojCzcionki, self.rozmiarCzcionki), bg="black", fg = self.kolorEthOdczyt.get()).grid(row = 1, column = 1, sticky="w")
# linia dash
self.liniaDash = tk.Label(self.rama, text = "DASH:" , font = (self.krojCzcionki, self.rozmiarCzcionki, "bold"), bg="black", fg= "white").grid(row = 2, column = 0, sticky = "w")
self.liniaDash0 = tk.Label(self.rama, textvariable = self.dashOdczyt, font = (self.krojCzcionki, self.rozmiarCzcionki), bg="black", fg = self.kolorDashOdczyt.get()).grid(row = 2, column = 1, sticky="w")
# linia ltc
self.liniaLtc = tk.Label(self.rama, text = "LTC:" , font = (self.krojCzcionki, self.rozmiarCzcionki, "bold"), bg="black", fg= "white").grid(row = 3, column = 0, sticky = "w")
self.liniaLtc0 = tk.Label(self.rama, textvariable = self.ltcOdczyt, font = (self.krojCzcionki, self.rozmiarCzcionki), bg="black", fg = self.kolorLtcOdczyt.get()).grid(row = 3, column = 1, sticky="w")
self.window.mainloop()
# %% utwórz bazę jeśli nie istnieje i zapisz pierwszy rekord
def baza_sql(self):
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute(
"""CREATE TABLE IF NOT EXISTS binance(
id INTEGER PRIMARY KEY AUTOINCREMENT,
data_wpisu text NOT NULL,
godzina text NOT NULL,
cena_btc text NOT NULL,
cena_eth text NOT NULL,
cena_dash text NOT NULL,
cena_litecoin text NOT NULL,
kolor_btc text NOT NULL,
kolor_eth text NOT NULL,
kolor_dash text NOT NULL,
kolor_ltc text NOT NULL);"""
)
conn.commit()
conn.close()
# spradzanie czy baza jest pusta
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute("Select count(id) From binance")
self.wynik = c.fetchone()[0]
c.close()
# Jeśli rekord nie istnieje dodaj
if self.wynik == 0:
self.readBTC = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")
self.taskBTC = self.readBTC.json()
self.btcUsd.set(self.taskBTC["price"])
self.btc = float(self.btcUsd.get())
self.readEth = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=ETHUSDT")
self.taskEth= self.readEth.json()
self.ethUsd.set(self.taskEth["price"])
self.eth = float(self.ethUsd.get())
self.readDash = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=DASHUSDT")
self.taskDash= self.readDash.json()
self.dashUsd.set(self.taskDash["price"])
self.dash = float(self.dashUsd.get())
self.readLtc = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=LTCUSDT")
self.taskLtc= self.readLtc.json()
self.ltcUsd.set(self.taskLtc["price"])
self.ltc = float(self.ltcUsd.get())
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute("INSERT INTO binance VALUES(NULL, :data_wpisu, :godzina, :cena_btc, :cena_eth, :cena_dash, :cena_litecoin, :kolor_btc, :kolor_eth, :kolor_dash, :kolor_ltc)",
{
'data_wpisu': strftime("%d-%m-%Y"),
'godzina': strftime("%H:%M:%S"),
'cena_btc': self.btc,
'cena_eth': self.eth,
'cena_dash': self.dash,
'cena_litecoin': self.ltc,
'kolor_btc': self.white,
'kolor_eth': self.white,
'kolor_dash': self.white,
'kolor_ltc': self.white
})
conn.commit()
conn.close()
else:
return print(self.wynik)
# %% Odczyt z api binance i zapis do bazy
def binance_krypto(self):
self.readBTC = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=BTCUSDT")
self.taskBTC = self.readBTC.json()
self.btcUsd.set(self.taskBTC["price"])
self.btc = float(self.btcUsd.get())
self.readEth = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=ETHUSDT")
self.taskEth= self.readEth.json()
self.ethUsd.set(self.taskEth["price"])
self.eth = float(self.ethUsd.get())
self.readDash = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=DASHUSDT")
self.taskDash= self.readDash.json()
self.dashUsd.set(self.taskDash["price"])
self.dash = float(self.dashUsd.get())
self.readLtc = requests.get("https://api.binance.com/api/v3/ticker/price?symbol=LTCUSDT")
self.taskLtc= self.readLtc.json()
self.ltcUsd.set(self.taskLtc["price"])
self.ltc = float(self.ltcUsd.get())
# odczyt z bazy
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute("SELECT * FROM binance ORDER BY id DESC LIMIT 1")
wynik = c.fetchall()
for row in wynik:
self.btcSql.set(row[3])
self.ethSql.set(row[4])
self.dashSql.set(row[5])
self.ltcSql.set(row[6])
c.close()
self.btcPorownaj = float(self.btcSql.get())
self.ethPorownaj = float(self.ethSql.get())
self.dashPorownaj = float(self.dashSql.get())
self.ltcPorownaj = float(self.ltcSql.get())
# porownanie wyników
if self.btc > self.btcPorownaj:
self.kolor_btc = "green"
elif self.btc < self.btcPorownaj:
self.kolor_btc = "red"
else:
self.kolor_btc = "white"
if self.eth > self.ethPorownaj:
self.kolor_eth = "green"
elif self.eth < self.ethPorownaj:
self.kolor_eth = "red"
else:
self.kolor_eth = "white"
if self.dash > self.dashPorownaj:
self.kolor_dash = "green"
elif self.dash < self.dashPorownaj:
self.kolor_dash = "red"
else:
self.kolor_dash = "white"
if self.ltc > self.ltcPorownaj:
self.kolor_ltc = "green"
elif self.ltc < self.ltcPorownaj:
self.kolor_ltc = "red"
else:
self.kolor_ltc = "white"
# zapis wyników do bazy sql
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute("INSERT INTO binance VALUES(NULL, :data_wpisu, :godzina, :cena_btc, :cena_eth, :cena_dash, :cena_litecoin, :kolor_btc, :kolor_eth, :kolor_dash, :kolor_ltc)",
{
'data_wpisu': strftime("%d-%m-%Y"),
'godzina': strftime("%H:%M:%S"),
'cena_btc': self.btc,
'cena_eth': self.eth,
'cena_dash': self.dash,
'cena_litecoin': self.ltc,
'kolor_btc': self.kolor_btc,
'kolor_eth': self.kolor_eth,
'kolor_dash': self.kolor_dash,
'kolor_ltc': self.kolor_ltc
})
conn.commit()
conn.close()
self.window.after(15000, self.binance_krypto)
def odczyt_sql(self):
conn = sqlite3.connect('btc_eth.db')
c = conn.cursor()
c.execute("SELECT * FROM binance ORDER BY id DESC LIMIT 1")
wynik = c.fetchall()
for row in wynik:
self.dataOdczyt.set(row[1])
self.godzinaOdczyt.set(row[2])
self.btcOdczyt.set(row[3])
self.ethOdczyt.set(row[4])
self.dashOdczyt.set(row[5])
self.ltcOdczyt.set(row[6])
self.kolorBtcOdczyt.set(row[7])
self.kolorEthOdczyt.set(row[8])
self.kolorDashOdczyt.set(row[9])
self.kolorLtcOdczyt.set(row[10])
c.close()
self.window.after(15000, self.odczyt_sql)
apl = Application()
Czy ktoś może mi pomóc podpowiedzieć.
self.liniaBtc0 = tk.Label(self.rama, textvariable = self.btcOdczyt, font = (self.krojCzcionki, self.rozmiarCzcionki), bg="black", fg = self.kolorBtcOdczyt.get()).grid(row = 0, column = 1, sticky="w")
, nie usunąłeś tego?