如何使用pyown和tkinter更新GUI中的文本变量

时间:2017-11-11 17:34:06

标签: python datetime tkinter auto-update openweathermap

正如标题提到的那样,我试图在tkinter gui中更新标签中的值。这些值来自使用pyown的OpenWeatherMap API,在我的订阅级别,我每分钟只能进行60次调用。由于我打算拨多个电话,我想每分钟或5分钟更新一次gui。我花了最近几天阅读类似的问题,我发现我需要睡眠功能来延迟更新。有些人建议我把我想要重复的内容放在真正的无限循环中,但是当我尝试这个时,gui只在我关闭窗口时才更新,而我无法控制更新之间的时间。其他人建议我使用.after函数,但是当我这样做时,我的程序编译但是gui永远不会弹出。我正在寻找某人向我展示这些解决方案中的任何一个在我的代码中是如何工作的,或者如果有第三个解决方案更适合我的代码更好,请让我看看它的外观,因为我很难过。

import tkinter as tk
import pyowm
from datetime import datetime, timedelta

class WeatherInfo(tk.Tk):

    def __init__(self):

        tk.Tk.__init__(self)
        self.wm_title('Forecast')
        self.currentTime = tk.StringVar(self, value='')
        self.d2temp_7 = tk.StringVar(self,value='')

        self.owm = pyowm.OWM('*INSERT YOUR OWM KEY HERE*')

        self.headLabel = tk.Label(self, text='5-Day Forecast of Cayce, US.')
        self.headLabel.pack()
        self.footLabel = tk.Label(self, textvariable=self.currentTime)
        self.footLabel.pack(side=tk.BOTTOM)

        self.day2Frame = tk.LabelFrame(self, text='D2')
        self.day2Frame.pack(fill='both', expand='yes', side=tk.LEFT)
        tk.Label(self.day2Frame, text="Temperature:").pack()
        tk.Label(self.day2Frame, textvariable=self.d2temp_7).pack()

        self.search()

    def search(self):
        fc = self.owm.three_hours_forecast_at_id(4573888)
        try:
            self.currentTime.set(datetime.today())
            self.d2temp_7.set("7am: " + str(fc.get_weather_at((datetime.today().replace(hour=13, minute=00) + timedelta(days=1))
                                 .strftime ('%Y-%m-%d %H:%M:%S+00')).get_temperature('fahrenheit')['temp']))
        except:
            self.temp.set('Pick a city to display weather.')

    def _quit(self):
        self.quit()
        self.destroy()

if __name__== "__main__":
    app = WeatherInfo()
    app.mainloop()

更多关于我的尝试:

while True:
    def __init__
    def search

但是正如这个答案所指出的那样,other answer,我在根目录中看不到我所做的任何改变。在真正的根之前。我不知道。(

这个问题接近我使用root.after(毫秒,结果)的答案,但当我对这个答案表示赞赏时,我的gui从未表现出来。 infinitely update

感谢所有试图解答此问题的人。

编辑:我根据建议缩短了代码。

1 个答案:

答案 0 :(得分:1)

根据this,您可以使用crypto-api功能,如下所示:

cryptonite