我想在我设计的应用程序中使用NSOpenPanel。以下是我目前所掌握的情况:
@objc.IBAction
def ShowOpenPanel_(self, sender):
self.panel = NSOpenPanel.openPanel()
self.panel.setCanChooseFiles_(False)
self.panel.setCanChooseDirectories_(True)
NSLog(u'Starting OpenPanel')
self.panel.beginForDirectory_file_types_modelessDelegate_didEndSelector_contextInfo_(
self.defaults.objectForKey_(u'projpath'),
objc.nil,
objc.nil,
self,
objc.selector(self.OpenPanelDidEnd_returnCode_contextInfo_,
signature='v:@ii'),
objc.nil)
NSLog(u'OpenPanel was started.')
def OpenPanelDidEnd_returnCode_contextInfo_(self, panel, returnCode, context):
NSLog('Panel ended.')
if (returnCode == NSOKButton):
NSLog(u'User selected OK')
path = self.panel.filenames()[0]
self.defaults.setObject_forKey_(path, u'projpath')
del self.panel
我关心的两条主线是:
^{pr2}$第三个参数应该是一个空指针。既然我不打算使用这些数据,我宁愿把它留空。我尝试过生成签名'v:@iv'
,并尝试使用objc.NULL
和python的{
打开面板的正确方法是:
Dan的代码也可以工作,但是我的变体稍微清晰一些:您不传递实际的方法,而是传递应该调用的方法的名称。在
我认为您根本不需要使用
objc.selector
;请尝试以下方法:我还发现我需要用
^{pr2}$PyObjCTools.AppHelper.endSheetMethod
装饰面板结束函数:以下是我如何写下你所拥有的:
更改说明:我总是使用
None
而不是objc.nil
,而且它还没有把我搞砸;我认为你的面板不需要是self
的属性,因为你在你的返回函数中得到了它;objc约定是函数的第一个字母是小写的。在相关问题 更多 >
编程相关推荐