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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:46:14