Answer the question
In order to leave comments, you need to log in
How to use info from w_info variable in def answer(call): function in Python?
Help is already tired of googling, I found something, it worked in other code, it gives an error AttributeError: 'NoneType' object has no attribute 'text'
Please, in simple language,
w_info is in #Wind description
@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);
Answer the question
In order to leave comments, you need to log in
You can make a global data dictionary (in this simple case, only for the wind, but you can write all similar data in this form), in which to write data on the city. Then, when you click the "Wind" button, just take the already prepared data from this dictionary.
# на верхнем уровне объявляем наш словарь
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':
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)
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question