如何修复aiogram 3.0中内联按钮分页重复显示问题
问题修复:aiogram 3.0 内联按钮分页重复数据问题
问题根源
- 按钮数据索引错误:
paginator函数循环创建按钮时,始终固定使用data[page],导致每页5个按钮都指向同一条数据,没有遍历当前页的多条记录。 - 页码边界判断错误:分页切换时的下一页条件逻辑错误,无法正确识别是否还有更多数据页。
修正后的代码
cur.execute("SELECT * FROM data") data = cur.fetchall() # 计算总页数,兼容数据总数不是5的倍数的情况 total_pages = (len(data) + 4) // 5 def paginator(page: int=0): builder = InlineKeyboardBuilder() # 计算当前页的起始、结束索引 start_idx = page * 5 end_idx = start_idx + 5 # 遍历当前页的数据集(剩余数据不足5条时自动取到末尾) for item in data[start_idx:end_idx]: button = InlineKeyboardButton(text=item[0], callback_data=item[1]) builder.add(button) builder.adjust(1) # 按需添加分页按钮(仅存在对应页面时显示) pagination_buttons = [] if page > 0: pagination_buttons.append(InlineKeyboardButton(text="⬅", callback_data=kb.Pagination(action="prev", page=page).pack())) if page < total_pages - 1: pagination_buttons.append(InlineKeyboardButton(text="➡", callback_data=kb.Pagination(action="next", page=page).pack())) if pagination_buttons: builder.row(*pagination_buttons, width=2) return builder.as_markup() @dp.callback_query(kb.Pagination.filter(F.action.in_(["prev", "next"]))) async def pagination_handler(call: CallbackQuery, callback_data: kb.Pagination): page_num = int(callback_data.page) page = page_num # 处理上一页/下一页逻辑,限制页码在有效范围内 if callback_data.action == "prev": page = max(page_num - 1, 0) elif callback_data.action == "next": page = min(page_num + 1, total_pages - 1) with suppress(TelegramBadRequest): await call.message.edit_text( "list", reply_markup=paginator(page) ) await call.answer() @dp.message() async def echo(message: Message): msg = message.text.lower() if msg == "list": await message.answer("list", reply_markup=paginator(0))
关键修改说明
- 分页数据区间计算:通过
page * 5确定当前页起始索引,截取对应区间的数据集循环创建按钮,确保每页显示不同的5条数据。 - 总页数适配:用
(len(data)+4)//5计算总页数,自动处理数据总数不是5的倍数的场景。 - 分页按钮逻辑优化:仅在存在上一页/下一页时显示对应按钮,避免无效操作。
- 页码边界限制:用
max和min确保页码始终在0到总页数-1的有效范围内。
内容的提问来源于stack exchange,提问作者nerduz
相关产品推荐
相关产品推荐

