@brexer74

Почему пайчарм даёт ошибку, но когда делаю то, что он просит опять ошибка?

Пробую сделать бота магазин. В части кода с инлайн кнопками, начался какой то треш. Помогите.

@bot.message_handler(content_types=['text'])
def meswork(call):
    if call.text.strip() == 'Перейти в каталог товаров':
        markup1 = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("Пица", callback_data='piza')
        item2 = types.InlineKeyboardButton("Кофэ", callback_data='cofe')
        item3 = types.InlineKeyboardButton("Сущиии", callback_data='pivo')
        markup1.add(item1, item2, item3)
        bot.send_message(call.chat.id, 'Выберете товар', reply_markup=markup1)
        @bot.callback_query_handler(func=lambda call: True)
        def work(call):
            if call.data == 'piza':
                print('pizaaa')
            elif call.data == 'cofe':
                print('cooofee')
            elif call.data == 'susi':
                print('susiiii')
        work(call)


При таком коде, выдаёт такую ошбику:
File "F:\Раб. стол\pythonProject2\main.py", line 59, in meswork
work(call)
File "F:\Раб. стол\pythonProject2\main.py", line 53, in work
if call.data == 'piza':
^^^^^^^^^
AttributeError: 'Message' object has no attribute 'data'. Did you mean: 'date'?

Но если я делаю то, что он просит

@bot.message_handler(content_types=['text'])
def meswork(call):
    if call.text.strip() == 'Перейти в каталог товаров':
        markup1 = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("Пица", callback_data='piza')
        item2 = types.InlineKeyboardButton("Кофэ", callback_data='cofe')
        item3 = types.InlineKeyboardButton("Сущиии", callback_data='pivo')
        markup1.add(item1, item2, item3)
        bot.send_message(call.chat.id, 'Выберете товар', reply_markup=markup1)
        @bot.callback_query_handler(func=lambda call: True)
        def work(call):
            if call.date == 'piza':
                print('pizaaa')
            elif call.date == 'cofe':
                print('cooofee')
            elif call.date == 'susi':
                print('susiiii')
        work(call)

Получаю уже другую ошибку:

File "F:\Раб. стол\pythonProject2\main.py", line 53, in work
if call.date == 'piza':
^^^^^^^^^
AttributeError: 'CallbackQuery' object has no attribute 'date'. Did you mean: 'data'?

И получился замкнутый круг! Что делать???

Если нужно. вот код всей программы:

import telebot
from telebot import types
import sqlite3
from random import randint


keyboard1 = telebot.types.ReplyKeyboardMarkup(True)

bot = telebot.TeleBot('')


@bot.message_handler(commands=['start'])
def start(call):
    connect = sqlite3.connect('bd')
    cursor = connect.cursor()

    cursor.execute('''CREATE TABLE IF NOT EXISTS user_id(
                    id TEXT,
                    balance INTEGER
                )''')

    cursor.execute('''CREATE TABLE IF NOT EXISTS tovar(
                       name TEXT,
                       price INTEGER,
                       kolvo INTEGER
                   )''')

    connect.commit()


    item1 = types.KeyboardButton("Перейти в каталог товаров")
    item2 = types.KeyboardButton("Пополнить баланс")
    item3 = types.KeyboardButton("Узнать мой баланс")
    markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
    markup.add(item1, item2, item3)
    bot.send_message(call.chat.id, 'Добро пожаловать в мазагин багетыча', reply_markup=markup)





@bot.message_handler(content_types=['text'])
def meswork(call):
    if call.text.strip() == 'Перейти в каталог товаров':
        markup1 = types.InlineKeyboardMarkup(row_width=1)
        item1 = types.InlineKeyboardButton("Пица", callback_data='piza')
        item2 = types.InlineKeyboardButton("Кофэ", callback_data='cofe')
        item3 = types.InlineKeyboardButton("Сущиии", callback_data='pivo')
        markup1.add(item1, item2, item3)
        bot.send_message(call.chat.id, 'Выберете товар', reply_markup=markup1)
        @bot.callback_query_handler(func=lambda call: True)
        def work(call):
            if call.date == 'piza':
                print('pizaaa')
            elif call.date == 'cofe':
                print('cooofee')
            elif call.date == 'susi':
                print('susiiii')
        work(call)
  • Вопрос задан
  • 237 просмотров
Пригласить эксперта
Ответы на вопрос 3
@ragq1991
Лень копировать код, подтягивать библиотеки, поэтому самый простой вариант. В троке "if call.date == 'piza':", где я так понял вылетает ошибка в первый раз, поставь точку-останова(запустить код нужно в режиме отладки, для этого в верхнем правом углу нажми не треугольник запуска а жука) и посмотри что у тебя лежит в переменной "call", есть там "data" или "date" или ещё что-то.
Ответ написан
Комментировать
Vindicar
@Vindicar
RTFM!
@bot.callback_query_handler(func=lambda call: True)
def work(call):


Не надо описывать обработчики внутри других обработчиков. Это не будет работать так, как ты этого ожидаешь. Однажды прописанный, обработчик остаётся до конца работы программы.
И уж ТОЧНО не нужно делать самому вызов work(call).
Ответ написан
Lord_of_Rings
@Lord_of_Rings
Python developer
Не лепить код наугад, а пойти и почитать доки
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы