首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >网络响应后Python不更新appJar

网络响应后Python不更新appJar
EN

Stack Overflow用户
提问于 2020-01-05 04:03:13
回答 1查看 34关注 0票数 0

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

app.py

代码语言:javascript
复制
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

代码语言:javascript
复制
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

代码语言:javascript
复制
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')

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

EN

回答 1

Stack Overflow用户

发布于 2020-01-05 19:30:37

在这里找到了答案。对于任何挣扎于此的人,在标签本身被添加到UI之前,标签更新调用需要排队。下面是用于app.py的代码,这些代码看起来像预期的那样工作:

代码语言:javascript
复制
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()

如果有人知道为什么会这样,我们会很感激的,但我想我会回答这个问题,以防其他人遇到同样的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59596922

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档