電報ボットの作成はかなり新しいです。私は python-telegram-bot モジュールを使用して電報ボットを構築しています。クリックするとテキストが変わるインラインボタンの実装に行き詰まりました。ソースまたは方法を共有できますか?前もって感謝します。
要するに私が意味することは次のとおりです。たとえば、テキストが「1」のインラインボタンをクリックして、クリックすると「2」に変更されます。
def one(update, context):
"""Show new choice of buttons"""
query = update.callback_query
bot = context.bot
keyboard = [
[InlineKeyboardButton("3", callback_data=str(THREE)),
InlineKeyboardButton("4", callback_data=str(FOUR))]
]
keyboard[0][int(query)-1] = InlineKeyboardButton("X", callback_data=str(THREE))
reply_markup = InlineKeyboardMarkup(keyboard)
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text="First CallbackQueryHandler, Choose a route",
reply_markup=reply_markup
)
return FIRST
最後に、私は私が欲しかったものを達成することができました。多分少し長くて格好良いコードではないかもしれませんが、私の解決策を投稿しました。
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Updater,
CommandHandler,
CallbackQueryHandler,
ConversationHandler)
import logging
FIRST, SECOND = range(2)
counter = 0
keyboard = [[InlineKeyboardButton('Decrement', callback_data='0')],
[InlineKeyboardButton(f'[{counter}]', callback_data='1')],
[InlineKeyboardButton('Increment', callback_data='2')]]
def start(update, context):
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(
'Please choose one of our services\n',
reply_markup=reply_markup
)
return FIRST
def update_and_get_reply_markup(inc_or_dec=None):
global keyboard
global counter
if inc_or_dec == True:
counter += 1
else:
counter -= 1
keyboard[1][0] = InlineKeyboardButton(
f'[{counter}]', callback_data='2')
reply_markup = InlineKeyboardMarkup(keyboard)
return reply_markup
def increment(update, context):
query = update.callback_query
reply_markup = update_and_get_reply_markup(inc_or_dec=True)
bot = context.bot
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text="Please choose one of our services\n",
reply_markup=reply_markup
)
return FIRST
def decrement(update, context):
query = update.callback_query
reply_markup = update_and_get_reply_markup()
bot = context.bot
bot.edit_message_text(
chat_id=query.message.chat_id,
message_id=query.message.message_id,
text="Please choose one of our services\n",
reply_markup=reply_markup
)
return FIRST
def main():
updater = Updater(
'TOKEN', use_context=True)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [CallbackQueryHandler(decrement, pattern='^'+str(0)+'$'),
CallbackQueryHandler(increment, pattern='^'+str(2)+'$')]
},
fallbacks=[CommandHandler('start', start)]
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()