繁体   English   中英

脚本完成后如何让键盘恢复原来的state?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM