Переменная price
является глобальной - если вы пытаетесь ее изменить, вам нужно сделать это явно:
def currentPrice():
global price
url = 'https://api.cryptowat.ch/markets/bitfinex/ethusd/price'
json_obj = urllib.request.urlopen(url)
data = json.load(json_obj)
for item, v in six.iteritems(data['result']):
# print("ETC: $", v)
price = str(v)
# print(type(etcar))
print(price)
return price
в противном случае Python будет «зеркально отображать» ее как локальную переменную внутри функции, а не изменять глобальную переменную.
Не стоит продолжать запускать все больше и больше потоков каждый раз, когда вы нажимаете кнопку - так:
updatebtn = Button(root, text="update", command=currentPrice)
возможно, имеет больше смысла.
Вам не нужно использовать потоки здесь, просто чтобы вызывать функции «в фоновом режиме». Вместо этого вы можете использовать собственную функцию .after tkinter, чтобы отложить функцию вызова. (использует миллисекунды, а не значения с плавающей запятой, кстати)
def timer(delay_ms, root, func):
func()
root.after(delay_ms, timer, root, func)
может быть полезным видом функции.
Затем, прежде чем запускать основной цикл или всякий раз, когда вы хотите начать, позвоните ему один раз:
timer(5000, root, currentPrice)
Если вы хотите, чтобы функция currentPrice запускалась в отдельном потоке, и, таким образом, не блокировать ваш основной поток графического интерфейса пользователя, если, например, имеется сетевая задержка, вы можете использовать потоки, подобные этому:
Thread(target=currentPrice, daemon=True).start()
, который будет запускать его в потоке-демоне - который будет автоматически убит, если вы закроете программу, или ctrl-c, или что-то еще. Таким образом, вы можете поместить эту строку в getCurrentPriceBG
или аналогичную функцию.