2012-08-26 4 views
1

Когда я вызываю setDelegate_ в свой код pyObjC, я получаю AttributeError: 'tuple' object has no attribute 'setDelegate_'.Невозможно вызвать методы для объектов в pyObjC

Мой код выглядит следующим образом:

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

Редактировать

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

+0

Что 'QTMovie.alloc() initWithAttributes_error_ (attribs, objc.nil)' вернуть? Кортеж ('QTMovie',' error')? –

+0

На самом деле она возвращает что-то вроде этого: '(, None)'. – LifeIsHealthy

+0

В Objective-C Я думаю, код выше кода должен работать безупречно. – LifeIsHealthy

ответ

1

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

Вы должны быть в состоянии чтобы получить доступ к объекту, который, как:

(movie, error) = QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil) 
+0

Wow thanks! Это было решением. В Objective-C ошибка будет передана во второй аргумент, но в pyObjC возвращается как второй элемент в кортеже. – LifeIsHealthy

2

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

В Objective-C:

QTMovie* movie; 
NSError* error = nil; 

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

В Python:.

movie, error = QTMovie.alloc().initWithAttributes_error_(attribs, None) 
if movie is None: 
    # do something with error