如何使用 pyown 和 tkinter 在 GUI 中更新 text-variables
How to update text-variables in a GUI using pyown and tkinter
如标题所述,我正在尝试在 tkinter gui 中更新标签中的值。这些值是使用 pyown 从 OpenWeatherMap API 中获取的,在我的订阅级别,我只能制作 60 calls/minute。因为我打算打很多电话,所以我希望每分钟或 5 分钟更新一次我的图形用户界面。最近几天我一直在阅读类似的问题,我发现我需要睡眠功能来延迟更新。有些人建议我把我想重复的内容放在真正的无限循环中,但是当我尝试这样做时,gui 只在我关闭 window 时更新,而且我无法控制更新之间的时间.其他人建议我使用 .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.mainloop()
之前的 while True 中所做的任何更改
这个问题使用 root.after(毫秒,结果)接近我的答案,但是当我实现这个答案时,我的 gui 从未显示。
感谢所有尝试回答此问题的人。
编辑:我已根据建议缩短了我的代码。
基于this你可以有一个函数,forecast_update
,如下所示:
import tkinter as tk
#these two needed only for API update simulation
import random
import string
root = tk.Tk()
forecast = tk.Label(text="Forecast will be updated in 60 seconds...")
forecast.pack()
# returns a string with 7 random characters, each time it is called, in order to simulate API
def update_request_from_api():
return ''.join(random.choice(string.ascii_lowercase) for x in range(7))
# Your function to update the label
def forecast_update():
forecast.configure(text=update_request_from_api())
forecast.after(60000, forecast_update) # 60000 ms = 1 minute
# calling the update function once
forecast_update()
root.mainloop()
如标题所述,我正在尝试在 tkinter gui 中更新标签中的值。这些值是使用 pyown 从 OpenWeatherMap API 中获取的,在我的订阅级别,我只能制作 60 calls/minute。因为我打算打很多电话,所以我希望每分钟或 5 分钟更新一次我的图形用户界面。最近几天我一直在阅读类似的问题,我发现我需要睡眠功能来延迟更新。有些人建议我把我想重复的内容放在真正的无限循环中,但是当我尝试这样做时,gui 只在我关闭 window 时更新,而且我无法控制更新之间的时间.其他人建议我使用 .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.mainloop()
之前的 while True 中所做的任何更改这个问题使用 root.after(毫秒,结果)接近我的答案,但是当我实现这个答案时,我的 gui 从未显示。
感谢所有尝试回答此问题的人。
编辑:我已根据建议缩短了我的代码。
基于this你可以有一个函数,forecast_update
,如下所示:
import tkinter as tk
#these two needed only for API update simulation
import random
import string
root = tk.Tk()
forecast = tk.Label(text="Forecast will be updated in 60 seconds...")
forecast.pack()
# returns a string with 7 random characters, each time it is called, in order to simulate API
def update_request_from_api():
return ''.join(random.choice(string.ascii_lowercase) for x in range(7))
# Your function to update the label
def forecast_update():
forecast.configure(text=update_request_from_api())
forecast.after(60000, forecast_update) # 60000 ms = 1 minute
# calling the update function once
forecast_update()
root.mainloop()