Pycord类内函数无法传递变量值问题求助
Pycord类内Select组件无法获取实例变量的解决方案
问题核心
类定义阶段,@discord.ui.select装饰器的执行时机早于实例初始化:
- 解析
MyView类时,装饰器会立即执行,此时self(实例对象)尚未创建,直接引用self.r会触发NameError。 - 即便未报错,
self.r是在__init__中才会被填充数据,装饰器执行时该列表为空,导致Select组件无选项显示。
修正方案
放弃装饰器定义Select的方式,改为在__init__中动态创建Select组件并绑定回调,确保能正确访问实例变量:
class MyView(discord.ui.View): def __init__(self, no): super().__init__() self.no = no self.manga = None self.chapters = None self.startnum = -25 self.endnum = 0 self.twentyfives = 0 self.r = [] # 匹配目标漫画数据 for i in data: if str(i["MangaName"]).lower() == no: self.manga = i break if self.manga is not None: self.chapters = int(self.manga["ChaptersNumber"]) self.twentyfives = (self.chapters // 25) + 1 self.startnum += 25 # 计算章节范围 if self.endnum + 25 > self.chapters: self.endnum = self.chapters else: self.endnum += 25 self.startnum += 25 # 生成Select选项 for title in range(self.startnum, self.endnum): self.r.append(discord.SelectOption( label=self.manga["Chaptersinfo"][title])) # 动态创建Select并绑定回调 select = discord.ui.Select( row=0, options=self.r ) select.callback = self.select_callback self.add_item(select) async def select_callback(self, interaction: discord.Interaction): # 从交互数据中获取选中的选项 manga_selected = interaction.data["values"][0] await interaction.response.send_message(f"Awesome! I like {manga_selected} too!")
补充说明
- 动态添加组件的方式彻底避开了装饰器的静态执行限制,确保
self.r填充完成后再创建Select。 - Pycord v2.x版本中,回调函数仅需接收
interaction参数,选中值可通过interaction.data["values"]获取;若使用旧版本,可调整参数为select, interaction。 - 判空操作推荐使用
is not None而非!= None,更符合Python编码规范。
内容的提问来源于stack exchange,提问作者ihl
相关产品推荐
相关产品推荐

