【问题标题】:Can't call methods on objects in pyObjC无法在 pyObjC 中的对象上调用方法
【发布时间】:2012-08-26 16:15:36
【问题描述】:

当我在我的 pyObjC 代码中调用 setDelegate_ 时,我得到一个 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)

编辑

我发现我不能对电影对象使用任何实例方法。

【问题讨论】:

  • QTMovie.alloc().initWithAttributes_error_(attribs, objc.nil) 返回什么?一个元组 (QTMovie, error) ?
  • 实际上它返回的是这样的:(&lt;QTMovie: 0x7f840d875d30 time scale = 1000, duration = 8553387, rate = 0.000000, tracks = { 0x7f840c8c2240 0x7f840c81fa00 0x7f840ce0be50 0x7f840cf764b0 0x7f840b444590 0x7f840b42d6e0 0x7f840d40ed10 0x7f840cd31290 0x7f840c8d1b40 }&gt;, None).
  • 在 Objective-C 中我认为上面的代码应该可以完美运行。
  • 不幸的是,您不是直接使用 Objective-C,而是使用接口。期待惊喜......

标签: python delegates quicktime pyobjc qtkit


【解决方案1】:

选择器“initWithAttributes:error:”在 Objective-C 中有两个参数,第二个是传递引用的输出参数。 Python 没有按引用传递的参数,因此 PyObjC 将该值作为第二个返回值返回,这就是该选择器的 Python 包装器返回一个元组的原因。这是一种通用机制,也可用于其他具有按引用传递参数的方法。

在 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

【讨论】:

    【解决方案2】:

    从您的评论看来,QTMovie.alloc().initWithAttributes_error_ 实际上返回了一个双元素元组,其中您想要的对象作为第一个元素,而其他对象在第二个元素中(可能是错误?)

    您应该能够像这样访问您的对象:

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

    【讨论】:

    • 哇,谢谢!这就是解决方案。在 Objective-C 中,错误将传递给第二个参数,但在 pyObjC 中,它作为元组中的第二个元素返回。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    • 2020-09-20
    • 1970-01-01
    相关资源
    最近更新 更多