为什么PyObjC文档如此糟糕?
例如,http://developer.apple.com/cocoa/pyobjc.html仍适用于OS X 10.4 Tiger,而不是10.5 Leopard。
官方的PyObjC页面同样糟糕,http://pyobjc.sourceforge.net/
我之所以考虑学习Ruby,主要是因为RubyCocoa的东西记录得好得多,并且有很多不错的教程(例如,http://www.rubycocoa.com/),也因为鞋子GUI工具箱
即使这个自动翻译不好的日语教程也比我能找到的其余文档更有用。
我要做的就是用Cocoa GUI创建相当简单的Python应用程序。
任何人都可以阐明这些可怕的文档,或者让我指向一些教程,这些教程不仅仅为我们提供大量代码,而且还假设我们知道`NSThread.detachNewThreadSelector_toTarget_withObject _(" queryController",self,None)'是做什么的..?
解决方案
回答
这个答案不会很有帮助,但是,作为一名开发人员,我讨厌做文档。这是一个开源项目,很难找到可以做文档的人。
回答
汤姆真的说了这一切。许多开源项目都有专门的开发人员,而很少有兴趣进行文档记录的开发人员。目标杆每天都在变化,这无济于事,这意味着不仅必须创建文档而且要维护文档。
回答
汤姆和马丁的回答绝对是正确的(在几乎任何开源项目中,我们都会发现大多数贡献者对开发都特别感兴趣,而对诸如文档之类的半相关问题则没有太大兴趣),但我不是认为最后的特定问题很适合PyObjC文档。
NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)
NSThread是Cocoa API的一部分,在Apple上已有记录,包括特定的方法+ detachNewThreadSelector:toTarget:withObject :(我想在那儿链接,但显然stackoverflow有解析它的错误)。 CocoaDev Wiki也有一篇文章。
我认为尝试记录可可粉不是PyObjC的好主意,除了几个如何在Python中使用它的基本示例。解释选择器也可能不在PyObjC的范围内,因为选择器也是Objective-C的功能,而不是PyObjC特有的功能。
回答
我同意该教程是有缺陷的,会在我们眼前抛出随机的,无法解释的代码。它介绍了诸如自动释放池和用户默认值之类的概念,而没有说明我们为什么要使用它们("用于内存管理的自动释放池"几乎无法解释)。
那说
basically all I want to do is write Cocoa applications without having to learn ObjC.
恐怕暂时,我们将需要对ObjC有基本的了解,以便从使用Cocoa的任何语言中受益。 PyObjC,RubyCocoa,Nu和其他充其量都是利基,而所有这些都是由对ObjC和Cocoa来龙去脉的人熟悉的。
现在,如果我们现实地将那些桥梁视为真正发挥脚本语言的作用,而不是尝试使用它们构建整个应用程序,那么我们将受益最大。尽管已经完成了这项工作(使用LimeChat,我现在正在使用RubyCocoa编写的应用程序),但这种情况很少见,可能还会持续一段时间。
回答
我偶然发现了一个关于PyObjC / Cocoa的好教程:
http://lethain.com/entry/2008/aug/22/an-epic-introduction-to-pyobjc-and-cocoa/
回答
All I want to do is create fairly simple Python applications with Cocoa GUI's.. Can anyone shed light on the horrible documentation, or point me at some tutorials that don't just give you huge blocks of code and assume you know what NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None) does..? [...] basically all I want to do is write Cocoa applications without having to learn ObjC.
尽管我基本上同意Soeren的回答,但我会更进一步:
在没有对Objective C有所了解的情况下使用Cocoa可能要花费很长时间,甚至可能。我们可以在上面引用的示例代码行中看到这一点:
NSThread.detachNewThreadSelector_toTarget_withObject_("queryController", self, None)
这是编写Objective C行的Python方法:
[NSThread detachNewThreadSelector:@selector(queryController:) toTarget:self withObject:nil];
现在,需要注意的是,可以用两种方式来看待这一行:(1)是目标C的行,或者(2)是可可框架的调用。通过语法,我们将其视为(1)。通过认识到NSThread是可可框架,它提供了一组方便的功能,我们将其视为(2)。在这种情况下,这种特殊的Cocoa框架使我们很容易让对象开始在新线程上执行某项操作。
但是,关键在于:这里的Cocoa框架(NSThread)以一种明确地与该框架所使用的语言绑定的方式为我们提供了这种便捷的服务。即,NSThread为我们提供了一个明确引用"选择器"的功能。实际上,选择器是有关Objective C工作原理的一些基本名称。
所以有摩擦。从根本上讲,可可是Objective-C的创造者,它的创建者在创建时就已经考虑了ObjectiveC。我并不是说不可能将可可功能的界面转换成其他语言更自然的形式。只是只要我们更改Cocoa框架以停止引用"选择器",它就不再是真正的Cocoa框架。这是翻译版本。一旦你开始走这条路,我猜事情就会变得非常混乱。我们正在努力跟上Apple在更新Cocoa方面的最新消息,也许我们碰到了Cocoa的某些部分,但无论如何都无法很好地将其翻译成新语言。因此,相反,诸如PyObjC之类的东西选择直接暴露可可,这种方式具有非常清晰和简单的相关性。正如他们在文档中所说的:
In order to have a lossless and unambiguous translation between Objective-C messages and Python methods, the Python method name equivalent is simply the selector with colons replaced by underscores.
当然,这有点丑陋,确实意味着我们需要了解一些有关Objective-C的知识,但这是因为,如果确实存在替代方案,则不一定会更好。
回答
直言不讳:
如果我们想成为一名有效的Cocoa程序员,则必须学习Objective-C。故事结局。
通过它们各自的桥梁,Python或者Ruby都不能替代Objective-C。我们仍然必须了解Objective-C API,NSObject派生类固有的行为以及Cocoa的许多其他细节。
PyObjC和RubyCocoa是从Cocoa应用程序访问Python或者Ruby功能的好方法,包括大部分(如果不是全部)在Python或者Ruby中构建Cocoa应用程序。但是,其中的成功是建立在对Cocoa及其组成的Objective-C API的透彻了解的基础上的。
回答
我对Objective C或者Cocoa一无所知(但是对Python却一无所知),但是我现在正在用PyObjc编写一个相当复杂的应用程序。我如何学习?我选择了用于OSX的Cocoa编程,并使用PyObjC进行了整本书(非常快速的过程)。只需忽略有关内存管理的任何内容,我们就可以了。唯一的警告是,有时我们必须使用诸如endSheetMethod之类的装饰器(实际上,我认为这是我唯一遇到的装饰器):
@PyObjcTools.AppHelper.endSheetMethod def alertEnded_code_context_(self, alert, choice, context): pass
回答
缺少PyObjC文档的主要原因是有一个开发人员(我),而且作为大多数开发人员,我并不特别喜欢编写文档。因为PyObjC对我来说是一个附带项目,所以我倾向于专注于功能和错误修复,因为这对我来说更有趣。
改善文档的最好方法是自愿在pyobjc-dev邮件列表中提供帮助。
顺便说一句:pythonmac-sig邮件列表(请参阅google)是在MacOSX(不仅仅是PyObjC)上获得Python帮助的出色资源。