Tkinter pyowm 不更新
Tkinter pyowm not updating
我有几个小部件,或者更准确地说,Label
s,当在 __init__.
中调用以 self.after()
结束的方法时,它们会完美更新
这里的标签不是这种情况,它通过 pyowm
从 OWM (OpenWeatherMap) 获取天气信息,并且应该每隔特定时间更新一次,在 after()
函数中定义。
尽管我是 Python 的新手,但我几乎尝试了所有知识。我已经搜索 google 好几天了,但没有找到可行的解决方案,或者说我无法让它发挥作用。
我试过将 after 函数放在每个方法中,甚至 __init__
.
为了调试和天气 Class 的修剪 main()
如下:
import tkinter as tk
from Weather import Meteo
def displayMeteo(win):
# Place Meteo portlet
meteoHandler = Meteo(win, bg='black', fg='white')
meteoHandler.pack(side='top', anchor='ne')
def main():
# Set the screen definition, root window initialization
root = tk.Tk()
root.configure(background='black')
width, height = root.winfo_screenwidth(),
root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (width, height))
label = tk.Label(root, text="Monitor Dashboard", bg='black',
fg='red')
label.pack(side='bottom', fill='x', anchor='se')
# Display portlet
displayMeteo(root)
# Loop the GUI manager
root.mainloop(0)
###############################
# MAIN SCRIPT BODY PART #
###############################
if __name__ == "__main__":
main()
和class:
import pyowm
import tkinter as tk
from PIL import Image, ImageTk
class Meteo(tk.Label):
def __init__(self, parent=None, **params):
tk.Label.__init__(self, parent)
self.API = pyowm.OWM('API KEY', config_module=None,
language='it', subscription_type=None)
self.location = self.API.weather_at_place('Rome,IT')
self.weatherdata = self.location.get_weather()
self.weather = str(self.weatherdata.get_detailed_status())
self.dictionary = {'poche nuvole': 'Parzialmente Nuvoloso',
'cielo sereno': 'Sereno', 'nubi sparse': 'Nuvoloso',
'temporale con pioggia': 'Temporale', 'pioggia leggera':
'Pioggerella'}
self.Display()
def Temperatur(self):
self.Temp = tk.StringVar()
self.tempvalue = self.weatherdata.get_temperature('celsius')
self.temperature = str(self.tempvalue.get('temp'))
self.Temp.set(self.temperature)
self.after(3000, self.Temperatur)
def WeatherInfo(self):
self.Weather = tk.StringVar()
self.weather = str(self.weatherdata.get_detailed_status())
if self.weather in self.dictionary:
self.weather = self.dictionary[self.weather]
self.weatherstring = self.weather.title()
self.Weather.set(self.weatherstring)
self.after(3000, self.WeatherInfo)
def Display(self):
self.Temperatur()
self.WeatherInfo()
self.configure(text=self.Weather.get() + ", " + self.Temp.get() + "°", bg='black',
fg='#FFFF96', font=("arial, 35"))
self.after(3000, self.Display)
现在,应该发生的是小部件每 3 秒更新一次(只是为了调试),虽然我知道即使更新有效它也不会每 3 秒更改一次,因为你知道...天气不会每 3 秒更改一次。
按照 Idlehands 的建议完成,问题不在标签或更新中。
代码,如果以这种方式编写,将只调用 .get_weather
一次,从而创建一个停滞变量。我添加了一个更新 pyowm 解析的方法,现在一切正常!
我有几个小部件,或者更准确地说,Label
s,当在 __init__.
中调用以 self.after()
结束的方法时,它们会完美更新
这里的标签不是这种情况,它通过 pyowm
从 OWM (OpenWeatherMap) 获取天气信息,并且应该每隔特定时间更新一次,在 after()
函数中定义。
尽管我是 Python 的新手,但我几乎尝试了所有知识。我已经搜索 google 好几天了,但没有找到可行的解决方案,或者说我无法让它发挥作用。
我试过将 after 函数放在每个方法中,甚至 __init__
.
为了调试和天气 Class 的修剪 main()
如下:
import tkinter as tk
from Weather import Meteo
def displayMeteo(win):
# Place Meteo portlet
meteoHandler = Meteo(win, bg='black', fg='white')
meteoHandler.pack(side='top', anchor='ne')
def main():
# Set the screen definition, root window initialization
root = tk.Tk()
root.configure(background='black')
width, height = root.winfo_screenwidth(),
root.winfo_screenheight()
root.geometry("%dx%d+0+0" % (width, height))
label = tk.Label(root, text="Monitor Dashboard", bg='black',
fg='red')
label.pack(side='bottom', fill='x', anchor='se')
# Display portlet
displayMeteo(root)
# Loop the GUI manager
root.mainloop(0)
###############################
# MAIN SCRIPT BODY PART #
###############################
if __name__ == "__main__":
main()
和class:
import pyowm
import tkinter as tk
from PIL import Image, ImageTk
class Meteo(tk.Label):
def __init__(self, parent=None, **params):
tk.Label.__init__(self, parent)
self.API = pyowm.OWM('API KEY', config_module=None,
language='it', subscription_type=None)
self.location = self.API.weather_at_place('Rome,IT')
self.weatherdata = self.location.get_weather()
self.weather = str(self.weatherdata.get_detailed_status())
self.dictionary = {'poche nuvole': 'Parzialmente Nuvoloso',
'cielo sereno': 'Sereno', 'nubi sparse': 'Nuvoloso',
'temporale con pioggia': 'Temporale', 'pioggia leggera':
'Pioggerella'}
self.Display()
def Temperatur(self):
self.Temp = tk.StringVar()
self.tempvalue = self.weatherdata.get_temperature('celsius')
self.temperature = str(self.tempvalue.get('temp'))
self.Temp.set(self.temperature)
self.after(3000, self.Temperatur)
def WeatherInfo(self):
self.Weather = tk.StringVar()
self.weather = str(self.weatherdata.get_detailed_status())
if self.weather in self.dictionary:
self.weather = self.dictionary[self.weather]
self.weatherstring = self.weather.title()
self.Weather.set(self.weatherstring)
self.after(3000, self.WeatherInfo)
def Display(self):
self.Temperatur()
self.WeatherInfo()
self.configure(text=self.Weather.get() + ", " + self.Temp.get() + "°", bg='black',
fg='#FFFF96', font=("arial, 35"))
self.after(3000, self.Display)
现在,应该发生的是小部件每 3 秒更新一次(只是为了调试),虽然我知道即使更新有效它也不会每 3 秒更改一次,因为你知道...天气不会每 3 秒更改一次。
按照 Idlehands 的建议完成,问题不在标签或更新中。
代码,如果以这种方式编写,将只调用 .get_weather
一次,从而创建一个停滞变量。我添加了一个更新 pyowm 解析的方法,现在一切正常!