Pixel'对象没有'setPixel'属性错误,无法弄清原因
下面的代码应该画出两条竖线,一条是红色的,从(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(...)
。