Python3 Tkinter标签值

时间:2018-09-01 16:17:31

标签: json python-3.x tkinter

我需要一些帮助,我试图在按下按钮后每隔5秒更新一次etcprice标签值,但在终端工作时却没有,但在tk窗口中却没有。我贴在这里:(请帮帮我。

我试图将“价格”设置为“ 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()

解决方案是:我创建了一个名为“ b”的新String变量,并将etcprice Label变量更改为此。 我在currentPrice()def:中添加了b.set(price)后,就可以了。

1 个答案:

答案 0 :(得分:0)

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)

可能更有意义。

您无需在此处使用线程,只需在“后台”调用函数即可。您可以使用tkinter自己的.after函数来延迟校准函数。 (它使用毫秒,而不是浮点数,顺便说一句)

def timer(delay_ms, root, func):
    func()
    root.after(delay_ms, timer, root, func)

可能是一种有用的功能。

然后在启动主循环之前,或者每当要开始启动时,都调用一次:

timer(5000, root, currentPrice)

例如,如果您希望currentPrice函数在单独的线程中运行,并且例如在存在网络滞后的情况下不阻塞主GUI线程,则可以使用更多类似这样的线程:

Thread(target=currentPrice, daemon=True).start()

将在守护程序线程中运行它-如果您关闭程序或ctrl-c或任何其他程序,它将自动被杀死。因此,您可以将该行放入getCurrentPriceBG或类似的函数中。