Constructing InlineKeyboardButton Dynamically in Python

Question:

I want to create a InlineKeyboardButton for Telegram in python like below function but I want to do it dynamically. This function groups two buttons in one line and add one button to second line. I want to make two button each line.

def options(bot, update):
    keyboard = [[InlineKeyboardButton("Option 1", callback_data='1'),
                 InlineKeyboardButton("Option 2", callback_data='2')],
                [InlineKeyboardButton("Option 3", callback_data='3')]]

    reply_markup = InlineKeyboardMarkup(keyboard)

    update.message.reply_text('Please choose:', reply_markup = reply_markup)

But what ever i try, i got error message like

data['inline_keyboard'].append([x.to_dict() for x in inline_keyboard])
AttributeError: 'list' object has no attribute 'to_dict'

My code is as follows:

def create_options(self, gid, Events):
    opts = []
    o = []
    keyboard = []

    for i, events in enumerate(Events):
        if (events.gid == gid):
            o.append([[InlineKeyboardButton(events.etkinlik + u"  ", callback_data=i),InlineKeyboardButton(events.etkinlik + u"  ", callback_data=i)]])
            opts.append(o)
    keyboard.append(opts)
    return InlineKeyboardMarkup(keyboard)

Could you suggest where i am doing wrong.

Thanks a lot for your help

Asked By: GurhanCagin

||

Answers:

i found the solution, if i code this way it works as i wanted.

keyboard = []
for i, events in enumerate(Events):
     if (events.gid == gid):
        keyboard = keyboard + 
        [[InlineKeyboardButton(events.etkinlik + u"  ", callback_data=i),
          InlineKeyboardButton(events.etkinlik + u"  ", callback_data=i + 100)]]
return InlineKeyboardMarkup(keyboard)
Answered By: GurhanCagin

This is a pretty neat way to do it:

sample_buttons = ['A', 'B', 'C', 'D']

keyboard = []
for i, button in enumerate(sample_buttons):
    keyboard.append([InlineKeyboardButton(button, callback_data=i)])

reply_markup = InlineKeyboardMarkup(keyboard)

update.message.reply_text('Please choose:', reply_markup = reply_markup)
Answered By: LUNA