Значение метки Python3 tkinter - PullRequest
       6

Значение метки Python3 tkinter

0 голосов
/ 01 сентября 2018

Мне нужна помощь, я пытаюсь обновить значение метки etcprice после нажатия кнопки и через каждые 5 секунд в терминале работает, но в окне tk нет. Я застрял здесь :( пожалуйста, помогите мне.

Я пытался установить "price" в "StringVar ()", но в этом случае я получил много ошибок.

Большое спасибо

    import urllib.request
    from urllib.request import *
    import json
    import six
    from tkinter import *
    import tkinter as tk
    import threading


    price = '0'

    def timer():
        threading.Timer(5.0, timer).start()
        currentPrice()

    def currentPrice():
        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

    def windows():
        root = Tk()
        root.geometry("500x200")

        kryptoname = Label(root, text="ETC price: ")
        kryptoname.grid(column=0, row=0)

        etcprice = Label(root, textvariable=price)
        etcprice.grid(column=1, row=0)

        updatebtn = Button(root, text="update", command=timer)
        updatebtn.grid(column=0, row=1)
        root.mainloop()

    windows()

Решение было : я создал новую переменную String с именем «b» и изменил переменную Label etcprice на эту. После того, как я добавил этот b.set (цена) в currentPrice () def: и работает.

1 Ответ

0 голосов
/ 03 сентября 2018

Переменная 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 или аналогичную функцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...