stik3228
@stik3228

Как в Python использовать инфу из переменной w_info в функции def answer(call):?

Хэлп устал уже гуглить, что то нашел, тестил в другом коде работало, тут ошибку выдает AttributeError: 'NoneType' object has no attribute 'text'
Пожалуйста простым языком
w_info находится в #Ветер описание
@bot.message_handler(content_types=['text'])
def lalala(message):
    asd = 'кек'
    markup_inline = types.InlineKeyboardMarkup(row_width=1)
    item_weather = types.InlineKeyboardButton(text = 'Погода', callback_data = 'weather')
    item_1 = types.InlineKeyboardButton(text = 'В разработке', callback_data = 'В разработке')
    item_2 = types.InlineKeyboardButton(text = 'кек', callback_data = 'кек')

    if message.text == '/start':
        markup_inline.add(item_weather, item_1, item_2)
        bot.send_message(message.chat.id, 'Привет, вот что умею', reply_markup = markup_inline)
    else:
        bot.send_message(message.chat.id, 'Нажми /start')


@bot.callback_query_handler(func = lambda call: True)
def answer(call):
# keyboard
    markup_reply = types.ReplyKeyboardMarkup(resize_keyboard=True)
    item_lipetsk = types.KeyboardButton("Липецк")
    item_moscow = types.KeyboardButton("Москва")
    item_voronesh = types.KeyboardButton("Воронеж") 
    item_end = types.KeyboardButton("Назад")

    if call.data == 'weather':
        markup_reply.add(item_lipetsk, item_moscow, item_voronesh, item_end)
        bot.send_message(call.message.chat.id, 'Напиши город или выбери из списка', reply_markup = markup_reply)
        bot.register_next_step_handler(call.message, get_weather);
    
    elif call.data == 'В разработке':
        bot.send_message(call.message.chat.id, 'В разработке ')
        sti = open('D:\\qwe\\AnimatedSticker.tgs', 'rb')
        bot.send_sticker(call.message.chat.id, sti)

    elif call.data == 'wind':
        bot.send_message(call.message.chat.id, get_weather(None, 'inline'))


# Погода
def get_weather(message, f=None):  
    config_dict = get_default_config()
    config_dict['language'] = 'ru'

    owm = OWM('dcad76afa495129ec79e7e217da53307', config_dict)
    mgr = owm.weather_manager()
    observation = owm.weather_manager().weather_at_place(message.text)
    w = observation.weather
# Температура
    temp = w.temperature('celsius')
    t1 = temp ['temp']        # Температура
    t2 = temp ['feels_like']  # Ощущается как
    t1r = round(t1)
    t2r = round(t2)
# Статус (Ясно, пасмурно, дождь)
    w.detailed_status
# Статус смайлы
    if w.detailed_status == 'облачно с прояснениями':
        s2 = 'Облачно с прояснениями ⛅️'
    elif w.detailed_status == 'переменная облачность':
        s2 = 'Переменная облачность ⛅️'
    elif w.detailed_status == 'небольшой дождь':
        s2 = 'Небольшой дождь '
    elif w.detailed_status == 'небольшая облачность':
        s2 = 'Небольшая облачность '
    elif w.detailed_status == 'туман':
        s2 = 'Туман '
    elif w.detailed_status == 'ясно':
        s2 = 'Ясно ☀️'
    elif w.detailed_status == 'пасмурно':
        s2 = 'Пасмурно ☁️'
    elif w.detailed_status == 'дождь':
        s2 = 'Дождь '
    elif w.detailed_status == 'сильный дождь':
        s2 = 'Сильный дождь '
    elif w.detailed_status == 'гроза':
        s2 = 'Гроза ⛈'
    elif w.detailed_status == 'снег':
        s2 = 'Снег '
    else:
        s2 = w.detailed_status
# Ветер
    wind = w.wind()
    w1 = wind['speed'] # Скорость
    w1r = round(w1)
    #w2 = wind['gust']  # Порывы
    w3 = wind['deg']   # Направление в градусах
    w.humidity
    w.rain
# Направление ветра    
    A = ['С ⬇️', 'СВ ↙️', 'В ⬅️', 'ЮВ ↖️', 'Ю ⬆️', 'ЮЗ ↗️', 'З ➡️', 'СЗ ↘️','С ⬇️']
    deg = w3
    B = deg/45
    C = round(B)
    w4 = (A[C])
    
# Скорость ветра смайлы
    # Штиль
    if w1 <= 0:
        w_smile = ' '
    # Тихий
    elif w1 <= 2:
        w_smile = ' '
    # Легкий
    elif w1 <= 3:
        w_smile = ' '
    # Слабый
    elif w1 <= 5:
        w_smile = ' '
    # Умеренный
    elif w1 <= 7:
        w_smile = ' '
    #Свежий
    elif w1 <= 11:
        w_smile = ' '
    #Сильный
    elif w1 <= 14:
        w_smile = ' '
    #Крепкий
    elif w1 <= 17:
        w_smile = ' '
    #Очень Крепкий
    elif w1 <= 21:
        w_smile = ' '
    #Шторм
    elif w1 <= 24:
        w_smile = ' '
    #Сильный Шторм
    elif w1 <= 28:
        w_smile = ' '
    #Жесткий Шторм
    elif w1 <= 33:
        w_smile = ' '
    #Ураган
    elif w1 > 33:
        w_smile = ' '

# Ветер описание
    # Штиль
    if w1 <= 0:
        w_info = 'Безветрие. Дым поднимается вертикально, листья деревьев неподвижны.'
    # Тихий
    elif w1 <= 2:
        w_info = 'Направление ветра заметно по относу дыма, но не по флюгеру'
    # Легкий
    elif w1 <= 3:
        w_info = 'Движение ветра ощущается лицом, шелестят листья, приводится в движение флюгер'
    # Слабый
    elif w1 <= 5:
        w_info = 'Листья и тонкие ветви деревьев всё время колышутся, ветер развевает лёгкие флаги'
    # Умеренный
    elif w1 <= 7:
        w_info = 'Ветер поднимает пыль и мусор, приводит в движение тонкие ветви деревьев'
    #Свежий
    elif w1 <= 11:
        w_info = 'Качаются тонкие стволы деревьев, движение ветра ощущается рукой'
    #Сильный
    elif w1 <= 14:
        w_info = 'Качаются толстые сучья деревьев, гудят телеграфные провода'
    #Крепкий
    elif w1 <= 17:
        w_info = 'Гнутся стволы деревьев, трудно идти против ветра.'
    #Очень Крепкий
    elif w1 <= 21:
        w_info = ' Ветер ломает сучья деревьев, идти против ветра очень трудно'
    #Шторм
    elif w1 <= 24:
        w_info = 'Небольшие повреждения, ветер начинает разрушать крыши зданий'
    #Сильный Шторм
    elif w1 <= 28:
        w_info = 'Значительные разрушения строений, ветер вырывает деревья с корнем'
    #Жесткий Шторм
    elif w1 <= 33:
        w_info = 'Большие разрушения на значительном пространстве. Наблюдается очень редко'
    #Ураган
    elif w1 > 33:
        w_info = 'Огромные разрушения, серьезно повреждены здания, строения и дома, деревья вырваны с корнями, растительность уничтожена.'



# Итог
    answer = 'Погода сейчас\n\n'+message.text.upper()+'\nТемпература: '+ str(t1r) + ' С°,\nПо ощущению: '+ str(t2r) + ' C°\n' + s2 + '\nCкорость ветра: ' + str(w1r) + ' м/с' + w_smile  + '\nНаправление ветра: ' + w4
    if f == 'inline':
        w_info
        return w_info
    else:
        markup_wind = types.InlineKeyboardMarkup(row_width=1)
        item_wind = types.InlineKeyboardButton(text = 'Ветер', callback_data = 'wind')       
        if message.text == message.text:
            markup_wind.add(item_wind)
            bot.send_message(message.chat.id, answer, reply_markup = markup_wind);
  • Вопрос задан
  • 149 просмотров
Решения вопроса 1
@o5a
Можно сделать глобальный словарь данных (в данном простом случае только для ветра, но можно и все похожие данные в таком виде записывать), в который записывать данные по городу. Затем при нажатии кнопки "Ветер" просто брать уже готовые данные из этого словаря.
# на верхнем уровне объявляем наш словарь
wind_info = {}

...
    elif w1 > 33:
        w_info = 'Огромные разрушения, серьезно повреждены здания, строения и дома, деревья вырваны с корнями, растительность уничтожена.'
# после определения w_info заносим эти данные в наш словарь
    wind_info[message.text] = w_info # т.к. message.text это наш город (вообще хорошо бы его сразу в отдельную переменную выделять, так код проще читается)

Но нам нужно в колбеке для ветра как-то указать, по какому городу хотим получить информацию о ветре. Мы можем сам город передать в колбеке
item_wind = types.InlineKeyboardButton(text = 'Ветер', callback_data = f'wind_{message.text}')

а затем его извлечь в самом колбеке
вместо старого
elif call.data == 'wind':
обрабатываем колбек вида "wind_Москва"
elif call.data.startswith('wind'):
        # извлекаем название города
        city = call.data.split('_',1)[1]
        # и берем нашу информацию из словаря данных по ветру
        w_info = wind_info[city]
        bot.send_message(call.message.chat.id, w_info)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы