Python appJar网络响应后未更新UI

问题描述 投票:0回答:1

我对python有点生疏,所以希望我只是在做一些愚蠢的事情。我正在尝试使用appJar和OpenWeatherMap创建一个简单的天气小部件,并且当网络响应返回时,UI并未按预期更新。我阅读了appJar文档,我知道我需要在另一个线程上启动网络请求,然后在响应返回时将UI更改放入队列,但似乎不起作用。到目前为止,这是一个非常简单的应用程序,下面是全部代码:

app.py

from appJar import gui
import datetime, pyowm, WeatherUtils
from WeatherInfo import WeatherInfo

LES_LAT = 40.714080
LES_LON = -73.985890

app = gui()
app.setBg("#363636")
app.setSize("Fullscreen")

# Date and time
def addDateTimeLabel(labelName: str, text: str) -> None:
    app.addLabel(labelName, text)
    app.setLabelFg(labelName, "White")
    app.setLabelFont(labelName, size=32)

now = datetime.datetime.now()
date = now.strftime("%A %B %e, %Y")
time = now.strftime("%l:%M %p")

addDateTimeLabel("date", date)
addDateTimeLabel("time", time)

# Weather UI
addDateTimeLabel('current_weather', 'Loading...')
addDateTimeLabel('forecast', 'Loading...')

app.go()

# Weather Data Fetch
def setCurrentWeatherData(weather_data: WeatherInfo) -> None:
    weather_string = 'Current: ' + weather_data.status + " " + str(weather_data.temp) + ", High: " + str(weather_data.max_temp) + ", Low: " + str(weather_data.min_temp)
    app.queueFunction(app.setLabel, 'current_weather', weather_string)

app.thread(WeatherUtils.getCurrentTemperature, LES_LAT, LES_LON, setCurrentWeatherData)

WeatherUtils.py

from typing import Callable, List
from WeatherInfo import WeatherInfo
import pyowm, datetime
from pyowm.weatherapi25.observation import Observation

OPEN_WEATHER_MAP_API_KEY = "XXXXXXXX"
owm = pyowm.OWM(OPEN_WEATHER_MAP_API_KEY)

def createWeatherInfoFromResponse(observation: Observation) -> WeatherInfo:
    weather_data = observation.get_weather()
    temperature_data = weather_data.get_temperature('fahrenheit')
    if temperature_data is None:
        return

    weather = WeatherInfo(temperature_data.get('temp'), temperature_data.get('temp_min'), temperature_data.get('temp_max'), weather_data.get_detailed_status().title())

    weather.snow = weather_data.get_snow()
    weather.icon_url = weather_data.get_weather_icon_url()
    weather.sunrise_time = weather_data.get_sunrise_time()
    weather.sunset_time = weather_data.get_sunset_time()
    weather.humidity = weather_data.get_humidity()
    wind_data = weather_data.get_wind()
    if wind_data is not None:
        weather.wind_direction = wind_data.get('deg')
        weather.wind_speed = wind_data.get('speed')

    weather.reference_time = weather_data.get_reference_time()
    weather.location = observation.get_location().get_name()
    return weather

def getCurrentTemperature(lat: float, lon: float, callback: Callable[[WeatherInfo], None]) -> None:
    weather_observation = owm.weather_at_coords(lat, lon)
    weather = createWeatherInfoFromResponse(weather_observation)
    if weather is not None:
        callback(weather)

WeatherInfo.py

class WeatherInfo:
    def __init__(self, temp: float, min_temp: float, max_temp: float, status: str):
        self.temp = temp
        self.min_temp = min_temp
        self.max_temp = max_temp
        self.status = status
        self.snow = None
        self.humidity = None
        self.icon_url = None
        self.sunrise_time = None
        self.sunset_time = None
        self.wind_direction = None
        self.wind_speed = None
        self.reference_time = None
        self.location = None

    def get_sunrise_time(self) -> str:
        return self.sunrise_time.strftime('%l:%M %p')

    def get_sunset_time(self) -> str:
        return self.sunset_time.strftime('%l:%M %p')

    def get_reference_time(self) -> str:
        return self.reference_time.strftime('%l:%M %p')

任何建议都非常感谢。谢谢!

python multithreading openweathermap appjar
1个回答
1
投票

在这里找出答案。对于其他为此苦苦挣扎的人,需要先将标签更新调用加入队列,然后再将标签本身添加到UI中。这是app.py的代码,它似乎可以按预期工作:

from appJar import gui
import datetime, pyowm, WeatherUtils
from WeatherInfo import WeatherInfo

LES_LAT = 40.714080
LES_LON = -73.985890

app = gui()
app.setBg("#363636")
app.setSize("Fullscreen")

# Date and time
def addDateTimeLabel(labelName: str, text: str) -> None:
    app.addLabel(labelName, text)
    app.setLabelFg(labelName, "White")
    app.setLabelFont(labelName, size=32)

now = datetime.datetime.now()
date = now.strftime("%A %B %e, %Y")
time = now.strftime("%l:%M %p")

addDateTimeLabel("date", date)
addDateTimeLabel("time", time)

# Weather Data Fetch
def setCurrentWeatherData(weather_data: WeatherInfo) -> None:
    weather_string = 'Current: ' + weather_data.status + " " + str(weather_data.temp) + ", High: " + str(weather_data.max_temp) + ", Low: " + str(weather_data.min_temp)
    app.queueFunction(app.setLabel, 'current_weather', weather_string)

app.thread(WeatherUtils.getCurrentTemperature, LES_LAT, LES_LON, setCurrentWeatherData)

# Weather UI
addDateTimeLabel('current_weather', 'Loading...')
addDateTimeLabel('forecast', 'Loading...')

app.go()

[如果有人对为什么会这样有任何见解,将不胜感激,但是如果其他人遇到相同的问题,我想我会回答这个问题。

© www.soinside.com 2019 - 2024. All rights reserved.