Pixel'对象没有'setPixel'属性错误,无法弄清原因

0 投票
2 回答
2214 浏览
提问于 2025-04-17 05:35

下面的代码应该画出两条竖线,一条是红色的,从(50,0)到(50,300),另一条是由随机像素组成的,从(150,50)到(150,250)。在第13行,提到的randomRed.setPixel(150,x,randomRed)出现了“'Pixel'对象没有'setPixel'属性”的错误。我搞不清楚为什么会出现这个错误。我不是应该用setPixel吗?

from cImage import*
import random


myImWin = ImageWin("Line Image", 300, 300)
lineImage = EmptyImage(300,300)
redPixel = Pixel(255,0,0)
randomRed = Pixel(random.randint(0,255),0,0)
for i in range(300):
    for x in range(250):
    lineImage.setPixel(50,i,redPixel)
    randomRed.setPixel(150,x,randomRed) # here is the error it points out
lineImage.draw(myImWin)
randomRed.save("lineImage.gif")

myImWin.exitonClick()

2 个回答

0

randomRed 是一个 Pixel(像素)。你为什么要给一个像素设置另一个像素呢?你希望这是什么意思呢?

你是想把 randomRed 这个 Pixel 画到和 redPixel 一样的 lineImage 上,所以每次你用 .setPixel 的时候,应该是 lineImage.setPixel

这个错误的意思就是字面上的意思。当你写 x.y(...) 这样的代码时,你是在尝试调用 x 对象的 y 方法。更准确地说,你是在查找 x 对象的 y 属性,然后把它当成一个函数来调用。(方法是一种特殊的属性,也是一种特殊的函数;当调用这个函数时,x 会隐式地作为参数传递给它。)

另外,你的循环逻辑是错的。因为你把循环嵌套在一起,所以每次都会运行最里面的代码,针对每一种 组合(i, x)的值。每一行都是一个独立的实体。你应该先用一个循环来画第一行,再用另一个循环来画第二行。

最后,你现在的做法不会得到“一行随机像素”,因为你只创建了一次 randomRed 像素,并且使用同一个像素画整整一行。要解决这个问题,你应该在循环内部创建随机像素,然后每次循环时都重新创建它,这样就会强制选择一个新的随机数。

1

我猜可能是你在调用 randomRed.setPixel(...),而不是 lineImage.setPixel(...)

撰写回答