Ну твоя проблема уже тут:
@bot.callback_query_handler(func=lambda call: True)
Ты говоришь боту "вызывай эту функцию всякий раз, когда пользователь нажимает кнопку"(callback_query_handler), и добавляешь "неважно, какая кнопка была нажата" (func=lambda call: True).
Поэтому у тебя callback() будет вызываться при нажатии ЛЮБОЙ кнопки.
Если ты хочешь, чтобы при нажатии разных кнопок вызывались разные функции, тебе нужно разделить их с помощью параметра func. В нём ты передаёшь маленькую функцию-фильтр, которая отвечает на вопрос "может ли эта функция обработать это нажатие?". Бот перебирает зарегистрированные callback-обработчики, и вызывает первый, чей фильтр вернул True.
Т.е. тебе нужно написать такие фильтры, которые смогут разделить нажатия отдельных кнопок.
Простой способ это сделать - реализовать иерархию в callback_data, например так:
# обрабатываем то, что начинается с 'city.'
@bot.callback_query_handler(func=lambda call: call.data.startswith('city.'))
def callback(call):
city = call.data[len('city.'):] # отрезаем префикс 'city.'
if city == 'istanbul':
bot.send_message(call.message.chat.id,'Вы выбрали город: Стамбул')
elif city == 'moscow':
bot.send_message(call.message.chat.id,'Вы выбрали город: Москва')
else:
bot.send_message(call.message.chat.id,'Я не знаю такого города')
А до этого ты где-то в другом обработчике послал сообщение с клавиватурой вида
keyboard = types.InlineKeyboardMarkup()
# обрати внимание, callback_data всегда начинается с 'city.'
keyboard.add(types.InlineKeyboardButton('Стамбул', callback_data='city.istanbul'))
keyboard.add(types.InlineKeyboardButton('Москва', callback_data='city.moscow'))
Так ты можешь разделить обработчики для разных наборов кнопок.
Еще советую почитать про FSM.