Tkinter pyowm не обновляется - PullRequest
0 голосов
/ 07 января 2019

У меня есть несколько виджетов, или, точнее, Label s, которые прекрасно обновляются, когда в __init__. вызывается метод, заканчивающийся self.after(). Это не относится к этой метке, которая получает информацию о погоде из OWM (OpenWeatherMap) через pyowm и должна обновляться каждый конкретный промежуток времени, определенный в функции after().

Я попробовал почти все, что мне известно, хотя я довольно новичок в Python. Я искал в Google в течение нескольких дней, но никакого рабочего решения не было найдено, или я не мог заставить его работать. Я пытался поставить функцию после в каждом методе, даже __init__.

Сокращенный 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()

И класс:

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 сек.

1 Ответ

0 голосов
/ 08 января 2019

Как и было предложено Idlehands , проблема заключалась не в метке или обновлении. Код, если он написан таким образом, вызовет .get_weather только один раз, создавая стагнационную переменную. Я добавил метод, который обновляет разбор pyowm, и теперь evertyhing работает нормально!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...