Как обновлять URL каждые 3 часа в Python - PullRequest
0 голосов
/ 06 ноября 2018

Я старый парень, пытающийся изучать программирование. Я пытался найти ответ на этот вопрос, но большинство ответов у меня над головой. Итак, я написал код для получения данных из Интернета, преобразования их в формат json и печати результатов в нужном формате. Сейчас я использую Tkinter для отображения этих данных. Мне удалось отобразить данные и обновить метки, но у меня возникли проблемы с получением URL-адреса для обновления (который вводит данные для меток). Итак, как я могу обновлять или запускать request.get через запланированный интервал (один раз каждые 3 часа), не используя цикл, который задерживал бы остальную часть программы?

Это то, что я сделал до сих пор (чтобы запустить эту программу, вам нужно будет ввести свой api с openweather.com) ....

import requests
import time
from tkinter import *

# Input Values
api = 'Enter API Key from Openweather.com'
lat = '33.608'
lon = '-111.863'
unit = 'imperial' # unit must be 'imperial' or 'metric'
fcast_time = [0, 4, 8, 12, 16, 20, 24, 28]  # each element is a 3 hour period (i.e. 4 would be 12 hours out), max is 40

main_window = Tk()

url2 = 'http://api.openweathermap.org/data/2.5/forecast?'+'lat='+str(lat)+'&lon='+str(lon)+'&APPID='+str(api)+'&units='+str(unit)

def fconvertTime(tperiod):
    period = fcast_data['list'][fcast_time[tperiod]]['dt']
    ftime = time.strftime("%a %p", time.localtime(period))
    return(ftime)

r_forecast = requests.get(url2)
fcast_data = (r_forecast.json())

def forecast_layout(frame_name, tperiod):
    label_fcast_day = Label(frame_name, text=fconvertTime(tperiod), justify=CENTER, font=("Ariel", 8), bg="black",
                            fg="white", width=13)
    label_test_update = Label(frame_name, text=time.strftime('%H:%M:%S'), justify=CENTER, font=("Ariel", 8), bg="black",
                       fg="white", width=13)
    label_fcast_day.grid(row=0, column=0)
    label_test_update.grid(row=3, column=0)

# Configure Main Window
main_window.title("Weather")
main_window.geometry("705x500")
main_window.resizable(True, True)
main_window.configure(bg="black")

# Define sub-frames
forecast_frame = Frame(main_window, bg="blue")
forecast_frame.grid(row=0, column=0, columnspan=3)


# Build forecast_frame
frame_fcast1 = Frame(forecast_frame)
forecast_layout(frame_fcast1, 0)
frame_fcast1.grid(row=0, column=0, pady=2, padx=2, sticky=W)

frame_fcast2 = Frame(forecast_frame)
forecast_layout(frame_fcast2, 1)
frame_fcast2.grid(row=0, column=1, pady=2, padx=2, sticky=W)


main_window.mainloop()

Заранее спасибо за любую помощь! Это все очень ново для меня (несколько недель), поэтому хотелось бы получить подробное объяснение.

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

Мне удалось найти решение этой проблемы.

update_frequency = 10800000  #value is in millisecends

def url2_renew():
        global r_forecast
        global fcast_data
        r_forecast = requests.get(url2)
        fcast_data = (r_forecast.json())
        main_window.after(update_frequency, url2_renew)

Поскольку URL-адрес уже был вызван, мне пришлось добавить «глобальный» в функцию, чтобы он знал, использовать глобальную переменную, а не локальную для функции.

0 голосов
/ 06 ноября 2018

Здесь вы хотите использовать функцию after, которая будет запускать код вместе с основным циклом TKinter. Вы затронули кое-что важное здесь; процесс может делать только одну вещь за раз, поэтому вам нужен mainloop в tk, чтобы отслеживать, когда пора запускать ваш код, чтобы он мог выполнять оставшуюся часть своей работы в промежутке времени.

def task():
    print("hello")
    # do your extractions
    main_window.after(60000, task)  # reschedule event in 60 seconds

main_window.after(60000, task)
main_window.mainloop()

Перед запуском основного цикла будет запланировано задание, которое будет выполняться за 60000 миллисекунд (или 60 секунд). task может быть любой функцией, которую вы определяете.

Когда task запускается, он также планирует другое выполнение самого себя, когда это заканчивается. Затем вы можете выполнять свою работу в функции task.

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