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,提问作者Іван Вікторович Конов
相关产品推荐
相关产品推荐

