@RG5000

Что я делаю не так при импорте в aiogram?

Код телеграм бота разбит на 3 файла: главный, кнопки и дополнительный.

Если весь код находится в одном файле, то всё работает идеально. Но когда пытаюсь все эти три файла соединить между собой через импорт, то половина действий не происходит. Например, не работают инлайновые кнопки.

Главный файл

import asyncio
from aiogram.types import *
from aiogram import Dispatcher, Bot, types, executor
from Folder1 import buttons
from Folder2 import dopolnitelny


bot = Bot ("Токен")
dp = Dispatcher(bot)


#ПРИВЕТСТВИЕ
@dp.message_handler(commands=["start"])
async def hello (message: types.Message):
    await bot.send_sticker(message.from_user.id, "Стикер")


#КНОПКИ ГЛАВНОГО МЕНЮ
@dp.message_handler()
async def main_menu (message: types.Message):

  if message.text == "Кнопка1":
    await message.answer("Первая кнопка", reply_markup=buttons.first)


#ПОДМЕНЮ КНОПКИ1
  if message.text == "Назад":
    await message.answer("Главное меню", reply_markup=buttons.main_menu)

  if message.text == "Кнопка Кнопки1":
    await message.answer("Появляются инлайновые кнопки", reply_markup=buttons.keyboard)


Dopolnitelny


if __name__ == "__main__":
       executor.start_polling(dp,skip_updates=True)


Файл с кнопками:

from aiogram.types import *
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton


#КНОПКА НАЗАД
back = KeyboardButton("Назад")


#ГЛАВНОЕ МЕНЮ
btn1 = KeyboardButton("Кнопка1")
main_menu = ReplyKeyboardMarkup(resize_keyboard=True).add(btn1)


#КНОПКА КНОПКИ1"
btn1a = KeyboardButton("Кнопка Кнопки1 ")
first = ReplyKeyboardMarkup(resize_keyboard=True).row(btn1a).add(back)

#ИНЛАЙНОВВЫЕ КНОПКИ 
btn1 = InlineKeyboardButton(text="Инлайн кнопка1", callback_data="btn1")
btn2 = InlineKeyboardButton(text="Инлайн кнопка2", callback_data="btn2")
btn3 = InlineKeyboardButton(text="Инлайн кнопка3", callback_data="btn3")
keyboard = InlineKeyboardMarkup(row_width=1)
keyboard.add(btn1, btn2, btn3)


Дополнительный файл (тут у всё для инлайновых кнопок)

from aiogram import Dispatcher, Bot, types, executor
import asyncio
from aiogram.types import *
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton


@dp.callback_query_handler(text="btn1")
async def btn1(call: CallbackQuery):
    photo = open("img.png", "rb")
    msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 1")
    keyboard = call.message.reply_markup
    btn1 = InlineKeyboardButton(text="Инлайн кнопка1 (Свернуть)", callback_data=f"{msg.message_id}_btn1")
    keyboard["inline_keyboard"][0][0] = btn1
    await call.message.edit_reply_markup(keyboard)


@dp.callback_query_handler(text="btn2")
async def btn2(call: CallbackQuery):
    photo = open("img.png", "rb")
    msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 2")
    keyboard = call.message.reply_markup
    btn2 = InlineKeyboardButton(text="Инлайн кнопка2 (Свернуть)", callback_data=f"{msg.message_id}_btn2")
    keyboard["inline_keyboard"][1][0] = btn2
    await call.message.edit_reply_markup(keyboard)


@dp.callback_query_handler(text="btn3")
async def btn3(call: CallbackQuery):
    photo = open("img.png", "rb")
    msg = await call.message.answer_photo(photo=photo, caption="Прикреплённый к фото текст кнопки 3")
    keyboard = call.message.reply_markup
    btn3 = InlineKeyboardButton(text="Инлайн кнопка2 (Свернуть)", callback_data=f"{msg.message_id}_btn3")
    keyboard["inline_keyboard"][2][0] = btn3
    await call.message.edit_reply_markup(keyboard)


@dp.callback_query_handler(regexp=r"[\d]+_btn1")
async def btn1_pthotodel(call: CallbackQuery):
    await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
    keyboard = call.message.reply_markup
    btn1 = InlineKeyboardButton(text="Инлайн кнопка1", callback_data="btn1")
    keyboard["inline_keyboard"][0][0] = btn1
    await call.message.edit_reply_markup(keyboard)


@dp.callback_query_handler(regexp=r"[\d]+_btn2")
async def btn1_pthotodel(call: CallbackQuery):
    await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
    keyboard = call.message.reply_markup
    btn2 = InlineKeyboardButton(text="Инлайн кнопка2", callback_data="btn2")
    keyboard["inline_keyboard"][1][0] = btn2
    await call.message.edit_reply_markup(keyboard)


@dp.callback_query_handler(regexp=r"[\d]+_btn3")
async def btn1_pthotodel(call: CallbackQuery):
    await bot.delete_message(call.message.chat.id, int(call.data.split("_")[0]))
    keyboard = call.message.reply_markup
    btn3 = InlineKeyboardButton(text="Инлайн кнопка3", callback_data="btn3")
    keyboard["inline_keyboard"][2][0] = btn3
    await call.message.edit_reply_markup(keyboard)


Никаких ошибок не выдаёт. Просто не работают инлайновые кнопки
А если помещаю коды с трёх файлов в один, то всё работает идеально.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 1
aleksashka
@aleksashka
Согласен в Борисом - нужно подтянуть Python, в частности импорты, использование модулей. Но и с ТС согласен - если делать что-то практическое, то мотивашка получше будет :).

Попробуйте посмотреть это видео (да и весь плейлист будет полезен): Telegram бот на python aiogram #4 хендлеры по файл..., там как раз описывается процесс разбивки кода на файлы, если не поможет, то можно и оставить всё в одном файле, но рано или поздно придётся всё-таки разобраться с импортами и прочим.
Ответ написан
Ваш ответ на вопрос

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

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