下面的代码应绘制两条垂直线,一条红线从(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()
答案 0 :(得分:1)
我的猜测是你打电话给randomRed.setPixel(...)
而不是lineImage.setPixel(...)
。
答案 1 :(得分:0)
randomRed
是Pixel
。为什么要设置像素的像素?你有什么期望呢?
您正试图将randomRed
Pixel
绘制到您将lineImage
绘制到的同一redPixel
上,因此您使用.setPixel
时都是如此,它应该是lineImage.setPixel
。
错误意味着它的内容。当您编写x.y(...)
之类的内容时,您正试图调用y
对象的x
方法。更确切地说,您尝试查找y
对象的x
属性,然后通过调用它将其视为函数。 (方法是一种特殊的属性,是一种特殊的函数; x
在调用时会作为参数隐式传递给函数。)
此外,您的循环逻辑是错误的。通过嵌套循环,您可以为每个 (i,x)值的组合运行最内层代码。每一行都是一个单独的实体。在i
上运行一个循环以绘制第一行,在x
上运行另一个循环以绘制第二行。
最后,你不会像你做的那样得到“随机像素”这一行,因为你用给定的随机数创建randomRed
像素一次,然后重复使用相同的像素线。要解决这个问题,请在绘制之前在循环内创建随机像素。然后,每次循环时,都会重新创建,强制选择另一个随机数。