我需要一些帮助,我试图在按下按钮后每隔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)后,就可以了。
答案 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
或类似的函数中。