как присвоить значение переменной в клавиатуре telebot?

Здравствуйте! Не могу передать значение для переменной в телеграмм боте! Вот код, мне нужно от пользователя получить город из предоставленного списка. Но на этапе вывода города происходит ошибка

NameError: name 'r' is not defined

    def button(message):
        
        markup = types.ReplyKeyboardMarkup(row_width=1, resize_keyboard=True, one_time_keyboard = True)
        button_1 = types.KeyboardButton('Москва')
        button_2 = types.KeyboardButton('Санкт-Перебург')
        button_3 = types.KeyboardButton('Екатеренбург')
        button_4 = types.KeyboardButton('Краснодар')
        button_5 = types.KeyboardButton('Ярославль')
        button_6 = types.KeyboardButton('Воронеж')
        button_7 = types.KeyboardButton('Уфа')
        button_8 = types.KeyboardButton('Пермь')
        button_9 = types.KeyboardButton('Омск')
        button_10 = types.KeyboardButton('Ростов-на-Дону')
        
        markup.add(button_10, button_9, button_8, button_7, button_6, button_5, button_4, button_3, button_2, button_1)
        bot.send_message(message.from_user.id, 'Выбирай город', reply_markup=markup)
        global r;
        if message.text == 'Москва':
            
            bot.send_message(message.chat.id, 'Москва')
            r = 'moskva'
        elif message.text == 'Санкт-Перебург':
            
    
            bot.send_message(message.chat.id, 'Санкт-Перебург')
            
            r = 'sankt-peterburg'
        elif message.text == 'Екатеренбург':
            
            bot.send_message(message.chat.id, 'Екатеренбург')
            
            r = 'ekaterinburg'
        elif message.text == 'Краснодар':
            
            bot.send_message(message.chat.id, 'Краснодар')
            
            r = 'krasnodar'
        elif message.text == 'Ярославль':
            
            bot.send_message(message.chat.id, 'Ярославль')
            
            r = 'yaroslavl'
        elif message.text == 'Воронеж':
            
            bot.send_message(message.chat.id, 'Воронеж')
            
            r = 'voronezh'
        elif message.text == 'Уфа':
            
            bot.send_message(message.chat.id, 'Уфа')
            
            r = 'ufa'
        elif message.text == 'Пермь':
            
            bot.send_message(message.chat.id, 'Пермь')
            
            r = 'perm'
        elif message.text == 'Омск':
            
            bot.send_message(message.chat.id, 'Омск')
            
            r = 'omsk'
        elif message.text == 'Ростов-на-Дону':
            
            bot.send_message(message.chat.id, 'Ростов-на-Дону')
    
            r = 'rostov-na-donu'
            
        bot.register_next_step_handler(message, parser);
        print(r)


Ответы (1 шт):

Автор решения: Gh0sTG0
  1. Зачем тебе там в global r; - ";"?

Смотри. Есть 2 варианта того как тебе порешать эту проблему:

Вариант 1, с продолжением использования global variables:

Import'ишь:

from tkinter import StringVar

Где то вначале, прямо в main(), там где код выполняется при запуске программы 1 раз задаешь:

global r
r = StringVar()
# и если хочется можешь сразу в нее что то задать, к примеру
r.set("gde-gde, V KARAGANDE!")

Дальше в КАЖДОЙ функции где ты собираешься использовать r задаешь

def ochen_poleznaja_funktcija():
    global r

...

def drugaja_ne_menee_poleznaja_funktcija():
    global r

...

Чтобы задать значение делаешь .set()

r.set("sankt-peterburg") # и.т.п. во всех местах где r =

И чтобы добыть вызываешь

r_for_things = r.get()
# и дальше либо работаешь с `r_for_things`,
# либо можно просто дергать в каждый раз `r.get()`

Правда я уже не помню что там с типами, почекай чего там тебе .get выдаст, хотя по идее это должен быть правильный string, но это не точно.

И 2 вариант, куришь ответ на вот этот вопрос и пытаешься переделать под работу без глобалов.

→ Ссылка