You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python aiogram inline按钮如何改造为可切换勾选状态的复选按钮

实现方案

你需要把静态的键盘定义改成动态生成的形式,同时用FSM状态存储用户的选中项,具体修改步骤如下:

1. 重构动态键盘生成逻辑

首先删除你原来的静态choise_sign_select_company键盘变量,替换为选项配置映射和动态生成键盘的函数:

from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton
from middlewares.internationlization import _

# 固定选项配置:callback_data对应显示文本前缀
SIGN_OPTIONS = {
    "market_cap_of_company": "Капитализация",
    "count_shares_ofustanding_of_company": "Кол-во акций",
    "current_prise_share_now_of_company": "Цена акции"
}

# 根据选中列表动态生成复选键盘
def generate_sign_keyboard(selected: list = None):
    selected = selected or []
    keyboard = InlineKeyboardMarkup(row_width=1)
    # 生成第一行两个按钮
    row1 = []
    for key in ["market_cap_of_company", "count_shares_ofustanding_of_company"]:
        btn_text = _(f"{SIGN_OPTIONS[key]} {'✅' if key in selected else '❌'}")
        row1.append(InlineKeyboardButton(text=btn_text, callback_data=key))
    keyboard.add(*row1)
    # 生成第二行单个按钮
    key = "current_prise_share_now_of_company"
    btn_text = _(f"{SIGN_OPTIONS[key]} {'✅' if key in selected else '❌'}")
    keyboard.add(InlineKeyboardButton(text=btn_text, callback_data=key))
    return keyboard

2. 修改消息发送Handler

给原来的handler注入state参数,初始化选中列表为空:

@dp.message_handler(text='Подобрать компании 🤑')
async def select_sign(message: types.Message, state: FSMContext):
    # 初始化用户选中列表为空
    await state.update_data(selected_signs=[])
    await message.answer(
        _('Выберите признаки на которых будет основываться подбор'), 
        reply_markup=generate_sign_keyboard()
    )
    await SelectCompanies.enter_the_sign.set()

3. 修改回调处理逻辑

增加状态读取、选中状态切换、键盘刷新的逻辑:

@dp.callback_query_handler(state=SelectCompanies.enter_the_sign)
async def select_interval(call: types.CallbackQuery, state: FSMContext):
    # 读取当前已选中的选项
    state_data = await state.get_data()
    selected_signs = state_data.get("selected_signs", [])
    current_option = call.data

    # 切换当前点击选项的选中状态
    if current_option in selected_signs:
        selected_signs.remove(current_option)
    else:
        selected_signs.append(current_option)
    
    # 把新的选中列表存回状态
    await state.update_data(selected_signs=selected_signs)
    # 刷新消息的键盘为最新状态
    await call.message.edit_reply_markup(
        reply_markup=generate_sign_keyboard(selected_signs)
    )
    # 保留原有回调应答逻辑
    await call.answer(current_option)

注意事项

  • 所有按钮的callback_data完全不变,不会影响你原有业务逻辑的取值
  • 后续需要获取用户选中的所有选项时,直接从状态中读取selected_signs字段即可
  • 如果需要新增确认按钮,直接在generate_sign_keyboard函数最后追加对应按钮即可

内容的提问来源于stack exchange,提问作者Іван Вікторович Конов

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 12:36:04