2016-04-23 2 views
1

Я пытаюсь передать изображение, взятое из ImageGrab, из метода класса. Но он возвращает None. Работает im.show() внутри takeSS().Объект 'NoneType' не имеет атрибута 'show'

import pyscreenshot as ImageGrab 

class Manager(): 
    def takeSS(self): 
     if __name__ == "__main__": 
      im = ImageGrab.grab(bbox=(0,0,1980,200)) 
      im.show() 
      return im 


m = Manager() 

img = m.takeSS() 
img.show() 

консоль:

AttributeError: 'NoneType' object has no attribute 'show' 
+0

Почему у вас есть оператор if внутри функции? Он оценивает значение false, поэтому блок не будет выполнен, и None будет возвращен. Теперь вы пытаетесь вызвать шоу на None, и это невозможно. – Querenker

+0

Пожалуйста, * всегда * включите ** полную ** трассировку для вашей ошибки. Теперь мы должны * угадать * это * второй * 'img.show()' вызов, который выдает исключение, а не сможет подтвердить его из traceback. –

ответ

1

У вас есть if __name__ == "__main__": охранник в середине вашего метода. Это очень необычное место для этого теста.

Если этот сценарий не запущен в качестве основного сценария, ваш метод Manager.takeSS() всегда будет возвращать None, что приведет к ошибке.

Удалите тест if оттуда. Это может иметь место вне класса, хотя:

import pyscreenshot as ImageGrab 

class Manager(): 
    def takeSS(self): 
     im = ImageGrab.grab(bbox=(0,0,1980,200)) # X1,Y1,X2,Y2 
     im.show() 
     return im 

if __name__ == "__main__": 
    m = Manager()   
    img = m.takeSS() 
    img.show() 

Код в тесте if теперь только работать, если вы используете этот модуль в качестве сценария. Этот же блок не будет работать, если вы используете import yourmodule.

+0

Это работает. Если я опускаю __name __ == "__main__", я получу другую ошибку. Я должен буду копаться в том, что он точно делает в другой раз. Но эта работа, поэтому я продолжу и дальше. Большое спасибо :) – SevenSoda

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