使用py-cord与discord.py开发Discord Bot时的View导入错误问题
解决
cannot import name 'View' from 'discord'错误及Discord Bot按钮实现方案 问题原因
你遇到的导入错误是因为View、Button等交互组件在discord.py/py-cord中并不直接在discord根模块下,而是位于discord.ui子模块中。另外如果同时安装了discord.py和py-cord两个库,也会导致命名冲突引发报错。
解决方案
1. 修正导入路径
无论你使用discord.py(版本≥2.0)还是py-cord,都需要从discord.ui导入View和Button组件,修改你的导入代码:
import discord from discord.ext import commands from discord import ButtonStyle, Embed from discord.ui import View, Button # 调整导入路径 import random import datetime import os import pytz import asyncio from dotenv import load_dotenv
2. 修复按钮逻辑漏洞
你的原代码还存在两个关键问题:
- 按钮未绑定回调函数,点击后不会触发任何操作
- 按钮未设置
custom_id,无法在回调中获取用户选择
修正后的完整命令代码如下:
@bot.slash_command(name="가위바위보", description="누리와 가위바위보 게임을 해보세요!") async def rock_paper_scissors(ctx): embed = Embed(title="가위바위보!", description="무엇을 내시겠어요?", color=0x00ff00) # 按钮点击回调函数 async def button_callback(interaction): user_choice = interaction.data['custom_id'] # 生成机器人的随机选择 bot_choice = random.choice(['바위', '보', '가위']) # 判断胜负逻辑 if user_choice == bot_choice: result = "무승부!" elif (user_choice == '바위' and bot_choice == '가위') or \ (user_choice == '보' and bot_choice == '바위') or \ (user_choice == '가위' and bot_choice == '보'): result = "너가 이겼어!" else: result = "나가 이겼어!" # 创建结果Embed result_embed = Embed(title="결과!", description=f"너의 선택: {user_choice}\n나의 선택: {bot_choice}\n{result}", color=0xffff00) await interaction.response.send_message(embed=result_embed, ephemeral=True) # 创建View和按钮,绑定回调并设置custom_id view = View() # 바위按钮 button_rock = Button(label="바위", style=ButtonStyle.blurple, custom_id="바위") button_rock.callback = button_callback # 보按钮 button_paper = Button(label="보", style=ButtonStyle.green, custom_id="보") button_paper.callback = button_callback # 가위按钮 button_scissors = Button(label="가위", style=ButtonStyle.red, custom_id="가위") button_scissors.callback = button_callback view.add_item(button_rock) view.add_item(button_paper) view.add_item(button_scissors) await ctx.send(embed=embed, view=view)
3. 避免库冲突
不要同时安装discord.py和py-cord,否则会引发命名空间冲突。执行以下命令卸载其中一个:
# 如果你用py-cord,卸载discord.py pip uninstall discord.py # 如果你用discord.py,卸载py-cord pip uninstall py-cord
4. 确保库版本达标
- discord.py需要升级到2.0及以上版本:
pip install -U discord.py - py-cord需要升级到2.0及以上版本:
pip install -U py-cord
关键注意事项
- 所有交互组件(View、Button、Select等)都必须从
discord.ui导入 - 按钮必须设置
custom_id才能在回调中识别用户选择 - 回调函数必须绑定到按钮的
callback属性才能触发 - 不要混用discord.py和py-cord的API,两者部分实现细节有差异
内容的提问来源于stack exchange,提问作者Andy Kim
相关产品推荐
相关产品推荐

