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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 10:35:48