Форум сайта python.su
0
Доброго времени суток. Сильно не пинайте, Питон изучаю первый день.
Собственно, вопрос такой - как обновлять (ну например, раз в 30 секунд) переменную в коде?
Суть такая - парсим JSON, берем оттуда переменную (в моем случае nowplay ) - используем эту переменную для вывода на LCD дисплей. Сейчас все работает. Но данные в JSON меняются. Хотелось бы каждые 30 секунд получать эту переменную nowplay и обновлять вывод на экране
Код сейчас такой:
import urllib, json, time url = "ТУТ URL" response = urllib.urlopen(url) data = json.loads(response.read()) nowplay = data['current']['name'] framebuffer = ['STATUS: OK!','',] def write_to_lcd(lcd, framebuffer, num_cols): lcd.home() for row in framebuffer: lcd.write_string(row.ljust(num_cols)[:num_cols]) lcd.write_string('\r\n') from RPLCD.i2c import CharLCD lcd = CharLCD(i2c_expander='PCF8574', address=0x27, port=1,cols=20, rows=4, dotsize=8, charmap='A00', auto_linebreaks=True) write_to_lcd(lcd, framebuffer, 16) long_string = nowplay for i in range(len(long_string) - 16 + 1): framebuffer[1] = long_string[i:i+16] write_to_lcd(lcd, framebuffer, 16) time.sleep(0.2) def loop_string(string, lcd, framebuffer, row, num_cols, delay=0.2): padding = ' ' * num_cols s = padding + string + padding for i in range(len(s) - num_cols + 1): framebuffer[row] = s[i:i+num_cols] write_to_lcd(lcd, framebuffer, num_cols) time.sleep(delay) while True: loop_string(long_string, lcd, framebuffer, 1, 16)
while True: loop_string(long_string, lcd, framebuffer, 1, 16)
# -*- coding: utf-8 -*- import urllib, json, time, sys from RPLCD.i2c import CharLCD lcd = CharLCD(i2c_expander='PCF8574', address=0x27, port=1,cols=16, rows=2, dotsize=8,charmap='A00',auto_linebreaks=True) def my_except_hook(exctype, value, traceback): if exctype == KeyboardInterrupt: time.sleep(2) lcd.close(clear=True) lcd.backlight_enabled = False else: sys.__excepthook__(exctype, value, traceback) sys.excepthook = my_except_hook while True: url = "тут URL" response = urllib.urlopen(url) data = json.loads(response.read()) nowplay = data['current']['name'] print("Данные получены") framebuffer = ['STATUS: OK!','',] def write_to_lcd(lcd, framebuffer, num_cols): lcd.home() for row in framebuffer: lcd.write_string(row.ljust(num_cols)[:num_cols]) lcd.write_string('\r\n') write_to_lcd(lcd, framebuffer, 16) #import time long_string = nowplay for i in range(len(long_string) - 16 + 1): framebuffer[1] = long_string[i:i+16] write_to_lcd(lcd, framebuffer, 16) time.sleep(0.2) def loop_string(string, lcd, framebuffer, row, num_cols, delay=0.2): padding = ' ' * num_cols s = padding + string + padding for i in range(len(s) - num_cols + 1): framebuffer[row] = s[i:i+num_cols] write_to_lcd(lcd, framebuffer, num_cols) time.sleep(delay) while True: loop_string(long_string, lcd, framebuffer, 1, 16) time.sleep(30)
Отредактировано Bastard34 (Окт. 20, 2019 19:54:31)
Офлайн
73
Bastard34
ну у вас вся оставшаяся часть кода ожидает паузу. парсите и обновляйте переменную в параллельном потоке с паузой а основной код вывода пусть работает без паузы
Офлайн
0
marvellikОгромадное Вам спасибо. До потоков еще не доучил. И до меня дошла моя ошибка )))
Bastard34ну у вас вся оставшаяся часть кода ожидает паузу. парсите и обновляйте переменную в параллельном потоке с паузой а основной код вывода пусть работает без паузы
Офлайн