Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 20, 2019 19:49:25

Bastard34
Зарегистрирован: 2019-10-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Обновление переменной

Доброго времени суток. Сильно не пинайте, Питон изучаю первый день.

Собственно, вопрос такой - как обновлять (ну например, раз в 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)
Загоняю цикл получения JSON в while с time.sleep (30) - данные берет каждые 30 секун, но текст перестает “бегать по экрану”, т.е. перестает работать
 while True:
    loop_string(long_string, lcd, framebuffer, 1, 16)
P.S. Постарался объяснить как можно проще…не ругайте, если совсем нифика не понятно

Код, при котором данные обновляются раз в 30 секунд, но при этом текст перестает “бегать”
 # -*- 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)

Офлайн

#2 Окт. 21, 2019 12:31:26

marvellik
Зарегистрирован: 2016-05-15
Сообщения: 639
Репутация: +  73  -
Профиль   Отправить e-mail  

Обновление переменной

Bastard34
ну у вас вся оставшаяся часть кода ожидает паузу. парсите и обновляйте переменную в параллельном потоке с паузой а основной код вывода пусть работает без паузы

Офлайн

#3 Окт. 21, 2019 14:04:04

Bastard34
Зарегистрирован: 2019-10-20
Сообщения: 2
Репутация: +  0  -
Профиль   Отправить e-mail  

Обновление переменной

marvellik
Bastard34ну у вас вся оставшаяся часть кода ожидает паузу. парсите и обновляйте переменную в параллельном потоке с паузой а основной код вывода пусть работает без паузы
Огромадное Вам спасибо. До потоков еще не доучил. И до меня дошла моя ошибка )))

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version