2014-11-17 5 views
0

Я искал сайт, это правда, что есть другие темы с тем же именем и те же проблемы, но я попытался прочитать и применить изменения к моей программе без каких-либо результатов, поэтому я решил открыть новый.Python - объект 'int' не имеет атрибута '__getitem__'

мне нужно создать класс Pixels (который я создал без проблем), и класс PImage, который вместо того, чтобы я нашел проблему:
(носить только самые важные методы)

класс Pixel:

class Pixel(object): 
    def __init__(self, r, g, b, op): // op = opacity 
     self.r, self.g, self.b, self.op = r, g, b, op 

    def __sub__(self, other): 
     return self.r-other.r,self.g-other.g,self.b-other.b 

класс PImage

class PImage(object): 
    def __init__(self, fname=None, size=None): 
     if(fname!=None): 
      img_app = image.load(fname) 
      self.immagine = img_app 
      w, h = len(img_app[0]), len(img_app) 

      for j in range(h): 
       for i in range(w): 
        self.immagine[j][i] = [Pixel(img_app[j][i][0], img_app[j][i][1], img_app[j][i][2], 255)] 

     elif(size!=None): 
      self.immagine = image.create(size[0], size[1], (0,0,0, 255)) 

    def size(self): 
     return len(self.immagine[0]), len(self.immagine) 

    def get_pixel(self, x, y): 
     if image.inside(x, y, self.immagine): 
      return self.immagine[y][x] 
     else: 
      return None 

    def opacity(self, x, y, t=150): 
     w, h = len(self.immagine[0]), len(self.immagine) 
     for j in range(h): 
      for i in range(w): 
       d = abs(self.get_pixel(x, x) - x) + abs(self.get_pixel(y, y) - y) + abs(self.immagine[j][i][0] - self.immagine[y][x][0]) + abs(self.immagine[j][i][1] - self.immagine[y][x][1]) + abs(self.immagine[j][i][2] - self.immagine[y][x][2]) 
       self.immagine[j][i][3] = (d*self.immagine[j][i][3])/(d + t) 

переменная d, у меня есть применять формулу, составленную следующим образом (здесь я получаю из ошибки):

d = abs (xp - x) + abs (yp - y) + abs (rp - r) + abs (gp - g) + abs (bp - b) 

где (xp, yp), (rp, gp, bp) op, соответственно, положение, цвет и непрозрачность p и (r, g, b) цвет пикселя в положении (x, y).

Traceback:

Я попытался вручную, и когда программа вызывает words.opacity(100, 160), программа возвращает ошибку

--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 
<ipython-input-16-3e2e34f8ee0f> in <module>() 
----> 1 words.opacity(100, 160) 

/home/user/Scrivania/python/program01.py in opacity(self, x, y, t) 
155    for i in range(w): 
156     #d = abs(self.immagine[j][i].x - x) + abs(self.immagine[j][i].y - y) + abs(self.immagine[j][i][0] - self.immagine[y][x][0]) + abs(self.immagine[j][i][1] - self.immagine[y][x][1]) + abs(self.immagine[j][i][2] - self.immagine[y][x][2]) 
--> 157     d = abs(self.get_pixel(x, x) - x) + abs(self.get_pixel(y, y) - y) + abs(self.immagine[j][i][0] - self.get_pixel[y][x][0]) + abs(self.immagine[j][i][1] - self.immagine[y][x][1]) + abs(self.immagine[j][i][2] - self.immagine[y][x][2]) 
158     self.immagine[j][i][3] = (d*self.immagine[j][i][3])/(d + t) 
159 

/home/user/Scrivania/python/program01.py in get_pixel(self, x, y) 
145 
146  def get_pixel(self, x, y): 
--> 147   if image.inside(x, y, self.immagine): 
148    return self.immagine[y][x] 
149   else: 

/home/user/Scrivania/python/image.pyc in inside(img, i, j) 
78  '''Ritorna True se il pixel (i, j) e' dentro l'immagine img, False 
79  altrimenti''' 
---> 80  w, h = len(img[0]), len(img) 
81  return 0 <= i < w and 0 <= j < h 
82 

TypeError: 'int' object has no attribute '__getitem__' 

Если функция внутри пакета image.pyc является:

def inside(img, i, j): 
w, h = len(img[0]), len(img) 
return 0 <= i < w and 0 <= j < h 
+0

Где вы действительно напутали ошибку? –

+0

Пожалуйста, отправьте полный ответ! Благодаря! –

+0

, когда я запускаю «вычитание» в формуле для вычисления d – rave

ответ

1

2 проблемы:

  • get_pixel() возвращает экземпляр Pixel, но вы пытаетесь вычесть его с помощью int. Поэтому, когда вы делаете self.get_pixel(x, x) - x, это запускает метод Pixel.__sub__ с other=x, где x является целым числом. Поэтому, когда он пытается получить доступ к other.r, он терпит неудачу, поскольку other является целым числом, а не объектом с атрибутом r.
  • self.get_pixel[y][x][0] не будет работать: self.get_pixel - это способ. Вероятно, вы имеете в виду self.get_pixel(y, x).r.
+0

oops, спасибо, что заставило меня заметить это вторая ошибка, это было отвлечение, я хотел написать 'abs (self.immagine [j] [i] [0] - self.immagine [y] [x] [0])'. и первая ошибка, как я могу исправить? как я могу сделать вычитание между пикселем объекта и целым числом? Благодарю. – rave

+0

@rave Я не знаю, что это зависит от того, что это значит для вас, чтобы вычитать целое число из пикселя :) Но, по вашей формуле, разве вы не имеете в виду 'abs (j - x) + abs (i - y) 'вместо' abs (self.get_pixel (x, x) - x) + abs (self.get_pixel (y, y) - y) '? – Schnouki

Смежные вопросы