【问题标题】:Name 'Actor' is not defined名称“演员”未定义
【发布时间】:2019-08-21 14:57:07
【问题描述】:

我在尝试编写游戏时遇到了 Python 编程问题(由本书介绍:Coding Games Python DK 3),它说: 名称“演员”未定义。

这是我的代码:

import pgzrun

from random import randint

WIDTH = 400
HEIGHT = 400

dots = []
lines = []

next_dot = 0

for dot in range(0, 10):
    actor = Actor("dot")
    actor.pos = randint(20, WIDTH -20), randint (20, HEIGHT - 20)
    dots.append(actor)

def draw():
    screen.fill("black")
    number = 1
    for dot in dots:
        screen.draw.text(str(number), (dot.pos[0], dot.pos[1] + 12))
    dot.draw()
    number = number + 1

for line in lines:
    screen.draw.line(line[0], line[1], (100, 0, 0))

pgzrun.go()

【问题讨论】:

  • 缺少Actor 类的导入,如果它在其他地方定义。
  • 您正在尝试创建Actor 类的实例,但该类未在您的代码中定义。在您的代码中定义或导入它。
  • 你用什么命令来运行代码?
  • 好吧,我使用python程序本身,从运行>>运行模块

标签: python pgzero


【解决方案1】:

您正在使用 Python 库 pgzero(间接通过导入 pgzrun)。

我已经将我的游戏代码重构为多个文件(导入到主文件中)并且也观察到了同样的奇怪现象

NameError: name 'Actor' 未定义

错误信息。

Actor 类似乎是“私有的”,但可以用这个简单的代码行导入:

from pgzero.builtins import Actor, animate, keyboard

背景见:

https://github.com/lordmauve/pgzero/issues/61

2019 年 8 月 18 日更新: 无法导入屏幕对象,因为它是在运行时作为全局变量创建的(对象 = Screen 类的实例)并且 IDE 支持的代码完成不是那么可能。查看源代码:https://github.com/lordmauve/pgzero/blob/master/pgzero/game.py(尤其是def reinit_screen 部分)

【讨论】:

  • 非常好。最后,孩子们可以从他们的书中编写代码,而不会一直被告知他们做错了:)
【解决方案2】:

Pygame 网站上的这个页面将帮助您从 IDE 运行它:https://pygame-zero.readthedocs.io/en/stable/ide-mode.html

基本上,你必须有这两行代码:

import pgzrun
...
...
pgzrun.go()

但在编码过程中,IDE 仍然会抱怨屏幕和 Actor 等对象和函数未定义。很烦人。据我所知,没有办法解决它,你只需要忽略抱怨并点击调试>运行。如果您没有错误,程序将编译并运行。

关于

import pgzrun
actor = pgzrun.Actor("dot")

或者

from pgzrun import *
dot=Actor("dot")

这些都不能帮助集成开发环境(如 Spyder 或 Visual Studio)识别对象和功能,如 screenActor

pgzrun 似乎不像普通的 python 库。 Pygame 依赖于使用 pgzrun 从命令行运行你的 python 脚本:

pgzrun mygame.py

【讨论】:

  • 查看我关于如何导入Actor 的回答。 screen 对象仍然是一个悬而未决的问题...stackoverflow.com/a/57512175
  • 感谢 Yoda,我刚刚尝试将“from pgzero.builtins import Actor, animate, keyboard,screen”放入我的代码中,它消除了所有 IDE 投诉,包括“未定义变量:屏幕”。
  • 对于screen 对象,到目前为止我还没有解决方案:-(
【解决方案3】:

如果您的 pip 包或同一目录中有 Actor,请定义类 Actor 或从包中导入它

【讨论】:

    【解决方案4】:

    从我在Pygame Documentation website 上可以找到的内容来看,Actor 是在 pgzrun 包中定义的。使用您当前的导入语句,您必须通过

    调用Actor 构造函数
    actor = pgzrun.Actor("dot")
    

    这将向编译器显示Actor 属于 pgzrun。

    或者,如果您只想使用 Actor("dot"),您可以将导入语句更改为

    from pgzrun import *
    

    这意味着“从 pgzrun 导入所有内容”。这也会跟踪来自 pgzrun 的内容并告诉编译器,但它可能会导致问题(例如,如果您在代码中定义自己的 Actor 构造函数,编译器将不知道您要使用哪个构造函数) )。

    【讨论】:

    • 我想我们理解构造函数是什么......也许阅读 R yoda 的回答。
    • @LindsayFowler 我肯定会有,如果我发布这个答案时它存在的话。
    【解决方案5】:

    嗯,我刚发现用cmd运行没有问题,从软件本身运行有问题。

    【讨论】:

      【解决方案6】:

      所以,代码是正确的,但我可能会怀疑一些事情。我认为您没有在 pgzero 中上传名为“dot”的图片。

      【讨论】:

        【解决方案7】:

        我收到了同样的错误消息,直到最后我在这里找到了这个主题。本书版本缺少 pgzrun 的第一行和最后一行。

        如果您在输入这些行后仍然出现错误,我敢打赌您的“python”指向 python2。在命令行试试这个:

        python -V
        

        如果它显示的版本为 2,则需要修复它。检查

        which python
        

        如果它在 /usr/bin 中,你可以这样做:

        sudo su
        cd /usr/bin
        rm python
        ln -s python3 python
        

        如果它位于 update-alternatives 目录中,您可以运行该程序来修复它。

        【讨论】:

          【解决方案8】:

          解决方法很简单。不要给文件一个 name.py 名称,因为它与 python numbers.py 冲突

          【讨论】:

            猜你喜欢
            • 2020-08-20
            • 2012-08-31
            • 2013-11-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多