Задать вопрос
@Maks_gm

Как изменить inline кнопки при нажатии telebot?

Делаю бота для игры "Супер крестики нолики". По правилам игры первым ходом игрок (крестик) выбирает сначала поле на которое он будет ходить, а потом клетку в этом поле.
Так вот, у меня сначала выводится поле из inline кнопок 3 на 3, в которых игрок выбирает поле на которое он будет ходить, а после это сообщение должно изменяться на такое же поле из кнопок 3 на 3, но при этом должно выводиться уже другое поле (grid_one, grid_two и т.д. до nine).

Вопрос: Как изменить в сообщении при нажатии определённой кнопки поле из кнопок?

Код:

Функции:

def game_grid(values_dict, all_moves_set):
    game_value = packaging_values(values_dict, all_moves_set)

    grid = InlineKeyboardMarkup()
    grid.row_width = 3
    for i in range(1, 10, 3):
        grid.add(InlineKeyboardButton(text=show_value(values_dict, i + 0),
                                      callback_data=f'1-{i + 0}-{game_value}'),
                 InlineKeyboardButton(text=show_value(values_dict, i + 1),
                                      callback_data=f'1-{i + 1}-{game_value}'),
                 InlineKeyboardButton(text=show_value(values_dict, i + 2),
                                      callback_data=f'1-{i + 2}-{game_value}'))
    return grid

def grid_one(values_dict_1, all_moves_set):
    game_value_1 = packaging_values(values_dict_1, all_moves_set)
    grid_one = types.InlineKeyboardMarkup(row_width=3)
    for i in range(1, 10, 3):
        grid_one.add(InlineKeyboardButton(text=show_value_1(values_dict_1, i + 0),
                                      callback_data=f'1-{i + 0}-{game_value_1}'),
                 InlineKeyboardButton(text=show_value_1(values_dict_1, i + 1),
                                      callback_data=f'1-{i + 1}-{game_value_1}'),
                 InlineKeyboardButton(text=show_value_1(values_dict_1, i + 2),
                                      callback_data=f'1-{i + 2}-{game_value_1}'))
    return grid_one
def grid_two(values_dict_2, all_moves_set):
    game_value_2 = packaging_values(values_dict_2, all_moves_set)
    grid_two = types.InlineKeyboardMarkup(row_width=3)
    for i in range(1, 10, 3):
        grid_two.add(InlineKeyboardButton(text=show_value_2(values_dict_2, i + 0),
                                      callback_data=f'1-{i + 0}-{game_value_2}'),
                 InlineKeyboardButton(text=show_value_2(values_dict_2, i + 1),
                                      callback_data=f'1-{i + 1}-{game_value_2}'),
                 InlineKeyboardButton(text=show_value_2(values_dict_2, i + 2),
                                      callback_data=f'1-{i + 2}-{game_value_2}'))
    return grid_two
    # Все grid'ы друг на друга похожи, только добавляется _3, _4 и т.д. к переменным

def unpacking_values(value_str):
    data = value_str.split('-')
    move = data[1]
    dict_str = data[2]
    set_str = data[3]

    values_dict = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_1 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_2 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_3 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_4 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_5 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_6 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_7 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_8 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    values_dict_9 = {'1': ' ', '2': ' ', '3': ' ',
                   '4': ' ', '5': ' ', '6': ' ',
                   '7': ' ', '8': ' ', '9': ' '}
    for i in range(1, 10):
        values_dict[str(i)] = dict_str[i - 1]
    for i in range(1, 10):
        values_dict_1[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_2[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_3[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_4[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_5[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_6[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_7[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_8[str(i)] = dict_str[i - 1]
    dict_str = data[2]
    for i in range(1, 10):
        values_dict_9[str(i)] = dict_str[i - 1]

    all_moves_set = set(set_str)
    return move, values_dict, all_moves_set, values_dict_1, values_dict_2, values_dict_3, values_dict_4, values_dict_5, values_dict_6, values_dict_7, values_dict_8, values_dict_9

message_handler:

elif message.text == 'Игра с ботом':
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            stop_playbot = types.KeyboardButton('Закончить игру')
            markup.add(stop_playbot)
            bot.send_message(message.chat.id,'Игра с ботом'.format(message.from_user), reply_markup=markup, parse_mode="html")
            all_moves_set = {'1', '2', '3', '4', '5', '6', '7', '8', '9'}

            values_dict_1 = {'1': ' ', '2': ' ', '3': ' ',
                           '4': ' ', '5': ' ', '6': ' ',
                           '7': ' ', '8': ' ', '9': ' '}
            bot.send_message(message.from_user.id, text="Игра началась",
                             reply_markup=grid_one(values_dict_1, all_moves_set))

callback:

@bot.callback_query_handler(func=lambda call: True)
def callback_data(call):
    if call.data[0] == '1':

        move, values_dict, all_moves_set, values_dict_1, values_dict_2, values_dict_3, values_dict_4, values_dict_5, values_dict_6, values_dict_7, values_dict_8, values_dict_9 = unpacking_values(call.data)

        if move in all_moves_set:
            if move == 1:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                    reply_markup=grid_one(values_dict_1, all_moves_set))
            elif move == 2:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_two(values_dict_2, all_moves_set))
            elif move == 3:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_three(values_dict_3, all_moves_set))
            elif move == 4:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_four(values_dict_4, all_moves_set))
            elif move == 5:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_five(values_dict_5, all_moves_set))
            elif move == 6:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_six(values_dict_6, all_moves_set))
            elif move == 7:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_seven(values_dict_7, all_moves_set))
            elif move == 8:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_eight(values_dict_8, all_moves_set))
            elif move == 9:
                bot.edit_message_reply_markup(call.message.from_user.id, text="Выберите клетку",
                                 reply_markup=grid_nine(values_dict_9, all_moves_set))
  • Вопрос задан
  • 123 просмотра
Подписаться 1 Простой 1 комментарий
Пригласить эксперта
Ответы на вопрос 1
@voidstring
Программист на Python
когда есть callback добавлять новые кнопки
тоесть:

@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
	try:
		if call.message:
			if call.data == "callback data":
                            markup = types.InlineKeyboardMarkup(row_width=2)
                            button1 = types.InlineKeyboardButton("кнопка", callback_data='button')
                            markup.add(button1)
                            bot.send_message(message.chat.id, 'сообщение', reply_markup=markup)
                         if call.data == 'button':
                             # ...
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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