Невозможно вызвать методы для объектов в pyObjC

Когда я вызываю setDelegate_ в своем коде pyObjC, я получаю AttributeError: 'tuple' object has no attribute 'setDelegate_'.

Мой код выглядит так:

def createMovie(self):
        attribs = NSMutableDictionary.dictionary()
        attribs['QTMovieFileNameAttribute'] = '<My Filename>'
        movie = QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil)
        movie.setDelegate_(self)

Изменить

Я обнаружил, что не могу использовать какие-либо методы экземпляра с объектом фильма.


person LifeIsHealthy    schedule 26.08.2012    source источник
comment
Что возвращает QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil)? Кортеж (QTMovie, error)?   -  person Pierre GM    schedule 26.08.2012
comment
На самом деле он возвращает что-то вроде этого: (<QTMovie: 0x7f840d875d30 time scale = 1000, duration = 8553387, rate = 0.000000, tracks = { 0x7f840c8c2240 0x7f840c81fa00 0x7f840ce0be50 0x7f840cf764b0 0x7f840b444590 0x7f840b42d6e0 0x7f840d40ed10 0x7f840cd31290 0x7f840c8d1b40 }>, None).   -  person LifeIsHealthy    schedule 26.08.2012
comment
Я думаю, что в Objective-C приведенный выше код должен работать безупречно.   -  person LifeIsHealthy    schedule 26.08.2012
comment
К сожалению, вы работаете не с Objective-C напрямую, а с интерфейсом. Ожидайте сюрпризов...   -  person Pierre GM    schedule 26.08.2012


Ответы (2)


Из вашего комментария похоже, что QTMovie.alloc().initWithAttributes_error_ на самом деле возвращает двухэлементный кортеж с нужным вам объектом в качестве первого элемента и некоторым другим объектом во втором элементе (возможно, ошибка?)

Вы должны иметь доступ к своему объекту следующим образом:

(movie, error) = QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil)
person Pierre GM    schedule 26.08.2012
comment
Вау, спасибо! Это было решением. В Objective-C ошибка будет передана второму аргументу, но в pyObjC она будет возвращена как второй элемент в кортеже. - person LifeIsHealthy; 27.08.2012

Селектор "initWithAttributes:error:" имеет два аргумента в Objective-C, второй из которых является выходным параметром передачи по ссылке. Python не имеет аргументов передачи по ссылке, поэтому PyObjC возвращает значение как второе возвращаемое значение, поэтому оболочка python для этого селектора возвращает кортеж. Это общий механизм, который также используется с другими методами, имеющими аргументы передачи по ссылке.

В цели-C:

QTMovie* movie;
NSError* error = nil;

movie = [[QTMovie alloc] initWithAttributes: attribs error:&error]
if (movie == nil) {
   // do something with error 
}

В Питоне:

movie, error = QTMovie.alloc().initWithAttributes_error_(attribs, None)
if movie is None:
  # do something with error
person Ronald Oussoren    schedule 20.11.2012