В вашем случае, для создания кнопок в aiogram, использующих данные из базы данных SQLite, вам необходимо создать функцию, которая будет извлекать данные из базы данных и на их основе формировать клавиатуру. Вот шаги, которые помогут вам настроить бота для выполнения описанных задач:
1. **Извлечение данных из SQLite**: Создайте функцию, которая подключается к вашей базе данных SQLite, выполняет запрос для получения списка городов и возвращает результат.
2. **Создание клавиатуры**: Используя полученные данные, создайте клавиатуру с кнопками для каждого города.
3. **Обработка команды `/start`**: Настройте обработчик команды `/start` для отправки клавиатуры пользователю.
4. **Выбор города и отображение товаров**: Настройте callback query handler, чтобы при выборе пользователем одного из городов извлекать товары для этого города и отображать их.
Вот пример кода, иллюстрирующий эти шаги:
```python
from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
import sqlite3
API_TOKEN = 'your_bot_token'
bot = Bot(token=API_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)
# Функция для извлечения городов из базы данных
def get_cities_from_db():
conn = sqlite3.connect('your_database.db')
cursor = conn.cursor()
cursor.execute("SELECT city_name FROM cities")
cities = cursor.fetchall()
conn.close()
return cities
# Функция для создания клавиатуры с городами
def cities_keyboard():
keyboard = InlineKeyboardMarkup(row_width=3)
cities = get_cities_from_db()
for city in cities:
city_name = city[0]
keyboard.insert(InlineKeyboardButton(city_name, callback_data=f"city_{city_name}"))
return keyboard
# Обработчик команды /start
@dp.message_handler(commands=['start'])
async def send_welcome(message: types.Message):
keyboard = cities_keyboard()
await message.answer("Выберите город:", reply_markup=keyboard)
# Callback query handler для обработки выбора города
@dp.callback_query_handler(lambda c: c.data and c.data.startswith('city_'))
async def process_city_callback(callback_query: types.CallbackQuery):
await bot.answer_callback_query(callback_query.id)
city_name = callback_query.data.split('_')[1]
# Тут нужно добавить логику для извлечения товаров для выбранного города
# Например:
# products = get_products_for_city(city_name)
# messages = "\n".join([f"{product['name']}: {product['price']}" for product in products])
# await bot.send_message(callback_query.from_user.id, messages)
# Не забывайте добавить реализацию get_products_for_city()
if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
```
Этот код является простым примером и может потребовать адаптации в соответствии с вашими конкретными нуждами и структурой базы данных. Замените `'your_bot_token'` реальным токеном вашего бота и `'your_database.db'` на путь к вашей базе данных SQLite.
Обратите внимание, что при построении клавиатуры мы используем InlineKeyboardButton, и каждая кнопка имеет `callback_data`, которая будет использоваться для идентификации выбранного города в callback query handler. Вам потребуется реализовать функцию `get_products_for_city`, которая будет возвращать список товаров в выбранном городе.