如何修复Discord机器人Cogs中NameError: name 'changePlaying'未定义问题
解决Discord.py Cog中
changePlaying未定义的NameError问题 我帮你分析下问题根源,再一步步给出修复方案:
1. 核心错误:类方法调用缺少self前缀
你在on_ready里直接写changePlaying(self)是不对的——changePlaying是你的Cog类的成员方法,必须通过self来引用它,Python才能找到这个方法。把这行代码改成:
self.bot.loop.create_task(self.changePlaying())
这是解决NameError的关键。
2. 修正PlayingList的语法错误
你写的PlayingList = [Maximus.py.","!help"]有两处语法问题:
- 字符串
Maximus.py没加引号 - 多了一个多余的点
修正后应该是:
PlayingList = ["Maximus.py", "!help"]
3. 适配Discord.py的版本变化
在较新的Discord.py版本中,change_presence的game参数已经被替换成activity,所以这行代码需要调整:
await self.bot.change_presence(activity=discord.Game(name=random.choice(PlayingList)))
4. 确保必要的导入
要让代码正常运行,文件顶部必须导入这些模块:
import discord from discord.ext import commands import random import asyncio
完整的修正后Cog示例
把所有修改整合后,你的Events Cog应该是这样的:
import discord from discord.ext import commands import random import asyncio class Events(commands.Cog): def __init__(self, bot): self.bot = bot self.PlayingList = ["Maximus.py", "!help"] # 建议把列表设为类属性,更规范 async def changePlaying(self): while True: await self.bot.change_presence(activity=discord.Game(name=random.choice(self.PlayingList))) await asyncio.sleep(120) @commands.Cog.listener() async def on_ready(self): print('Logged in as') print(self.bot.user.name) print(self.bot.user.id) print('-----------------------------------------') print('Log in complete') for x in range(5): print("") # 修复方法调用 self.bot.loop.create_task(self.changePlaying()) # 注册Cog的必要函数 def setup(bot): bot.add_cog(Events(bot))
最后检查
- 确认你的Cog类正确继承了
commands.Cog on_ready上方必须加@commands.Cog.listener()装饰器,否则Discord.py不会识别这个事件- 主文件里要通过
bot.load_extension("events")加载这个Cog
这样修改后,机器人就能正常切换状态栏,NameError也会消失。
内容的提问来源于stack exchange,提问作者Mooles
相关产品推荐
相关产品推荐

