[英]How to return the keyboard to its original state after the completion of the script?
该脚本是电报机器人的一部分。 该脚本的任务是为用户提供多种选择。
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Updater,
CommandHandler,
CallbackQueryHandler,
ConversationHandler)
import logging
green_check = '\u2705'
grey_check = '\u2714'
FIRST, ANSWER = range(2)
TEXT_1 = 'Click'
CHECK = grey_check
CLICK = False
KEYS = {'1': (0, 0), '2': (0, 1), '3': (1, 0), '4': (1, 1)}
keyboard = [
[
InlineKeyboardButton(f'1 {grey_check}', callback_data='1'),
InlineKeyboardButton(f'2 {grey_check}', callback_data='2'),
],
[
InlineKeyboardButton(f'3 {grey_check}', callback_data='3'),
InlineKeyboardButton(f'4 {grey_check}', callback_data='4'),
],
[
InlineKeyboardButton('Next \u27A1', callback_data='next'),
],
]
def start(update, context):
CHECK = grey_check
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(TEXT_1, reply_markup=reply_markup)
for i in range(1,5):
context.user_data[f'BUTTON_{i}'] = False
return FIRST
def clicked(click=None, data=None):
global keyboard
global CHECK
if click == True:
CHECK = green_check
else:
CHECK = grey_check
keyboard[KEYS[data][0]][KEYS[data][1]] = InlineKeyboardButton(
f'{data} {CHECK}', callback_data=f'{data}')
reply_markup = InlineKeyboardMarkup(keyboard)
return reply_markup
def press(update, context):
data = update.callback_query.data
global CLICK
if context.user_data[f'BUTTON_{data}'] == False:
context.user_data[f'BUTTON_{data}'] = True
else:
context.user_data[f'BUTTON_{data}'] = False
reply_keyboard = clicked(context.user_data[f'BUTTON_{data}'], data)
update.callback_query.edit_message_text(text=TEXT_1, reply_markup=reply_keyboard)
return FIRST
def send(update, context):
text = ''
for i in range(1, 5):
text += f'{i} - ' + str(context.user_data[f'BUTTON_{i}']) + '\n'
context.user_data[ANSWER] = text
update.callback_query.edit_message_text(text=context.user_data[ANSWER])
return ConversationHandler.END
def main():
updater = Updater(
'TOKEN', use_context=True)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [
CallbackQueryHandler(press, pattern='^'+str(1)+'$'),
CallbackQueryHandler(press, pattern='^'+str(2)+'$'),
CallbackQueryHandler(press, pattern='^'+str(3)+'$'),
CallbackQueryHandler(press, pattern='^'+str(4)+'$'),
CallbackQueryHandler(send, pattern='^'+'next'+'$'),
],
},
fallbacks=[CommandHandler('start', start)]
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
选择选项后,按钮的颜色变为绿色,在发送数据和下一次运行 /start 脚本后,键盘不会恢复到原来的形式。 用户按下的按钮保持绿色,而当按下按钮时,数据会按预期发生变化。
经过几次尝试,我找到了这个解决方案:
from telegram import InlineKeyboardButton, InlineKeyboardMarkup
from telegram.ext import (
Updater,
CommandHandler,
CallbackQueryHandler,
ConversationHandler)
import logging
green_check = '\u2705'
grey_check = '\u2714'
FIRST, ANSWER = range(2)
TEXT_1 = 'Click'
CHECK = grey_check
CLICK = False
BUTTONS = []
KEYS = {'1': (0, 0), '2': (0, 1), '3': (1, 0), '4': (1, 1)}
keyboard = [
[
InlineKeyboardButton(f'1 {CHECK}', callback_data='1'),
InlineKeyboardButton(f'2 {CHECK}', callback_data='2'),
],
[
InlineKeyboardButton(f'3 {CHECK}', callback_data='3'),
InlineKeyboardButton(f'4 {CHECK}', callback_data='4'),
],
[
InlineKeyboardButton('Next \u27A1', callback_data='next'),
],
]
def start(update, context):
global CHECK
global keyboard
global BUTTONS
CHECK = grey_check
for data in BUTTONS:
keyboard[KEYS[data][0]][KEYS[data][1]] = InlineKeyboardButton(
f'{data} {CHECK}', callback_data=f'{data}')
reply_markup = InlineKeyboardMarkup(keyboard)
update.message.reply_text(TEXT_1, reply_markup=reply_markup)
for i in range(1,5):
context.user_data[f'BUTTON_{i}'] = False
BUTTONS = []
return FIRST
def clicked(click=None, data=None):
global keyboard
global CHECK
global BUTTONS
if click == True:
CHECK = green_check
else:
CHECK = grey_check
BUTTONS.append(data)
keyboard[KEYS[data][0]][KEYS[data][1]] = InlineKeyboardButton(
f'{data} {CHECK}', callback_data=f'{data}')
reply_markup = InlineKeyboardMarkup(keyboard)
return reply_markup
def press(update, context):
data = update.callback_query.data
global CLICK
if context.user_data[f'BUTTON_{data}'] == False:
context.user_data[f'BUTTON_{data}'] = True
else:
context.user_data[f'BUTTON_{data}'] = False
reply_keyboard = clicked(context.user_data[f'BUTTON_{data}'], data)
update.callback_query.edit_message_text(text=TEXT_1, reply_markup=reply_keyboard)
return FIRST
def send(update, context):
text = ''
for i in range(1, 5):
text += f'{i} - ' + str(context.user_data[f'BUTTON_{i}']) + '\n'
context.user_data[ANSWER] = text
update.callback_query.edit_message_text(text=context.user_data[ANSWER])
return ConversationHandler.END
def main():
updater = Updater(
'TOKEN', use_context=True)
dp = updater.dispatcher
conv_handler = ConversationHandler(
entry_points=[CommandHandler('start', start)],
states={
FIRST: [
CallbackQueryHandler(press, pattern='^'+str(1)+'$'),
CallbackQueryHandler(press, pattern='^'+str(2)+'$'),
CallbackQueryHandler(press, pattern='^'+str(3)+'$'),
CallbackQueryHandler(press, pattern='^'+str(4)+'$'),
CallbackQueryHandler(send, pattern='^'+'next'+'$'),
],
},
fallbacks=[CommandHandler('start', start)]
)
dp.add_handler(conv_handler)
updater.start_polling()
updater.idle()
if __name__ == "__main__":
main()
也许这不是最好的解决方案。 您对如何改进此代码有任何想法吗?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.