Проблема с openPanelDidEnd в PyObjC в 10.6 - PullRequest
0 голосов
/ 28 сентября 2010

Следующий код, который работал нормально под OS X 10.5, теперь не работает на 10.6:

    @IBAction
def addButton_(self, sender):
    panel = NSOpenPanel.openPanel()
    panel.setCanChooseDirectories_(YES)
    panel.setAllowsMultipleSelection_(YES)
    try:
        panel.beginSheetForDirectory_file_modalForWindow_modalDelegate_didEndSelector_contextInfo_(self.directory, None, NSApp().mainWindow(), self, 'openPanelDidEnd:panel:returnCode:contextInfo:', None)
    except:
        pass

@AppHelper.endSheetMethod
def openPanelDidEnd_panel_returnCode_contextInfo_(self, panel, returnCode, contextInfo):

Я получаю ошибку:

objc.BadPrototypeError: Python signature doesn't match implied Objective-C signature for <unbound selector openPanelDidEnd:panel:returnCode:contextInfo: of controller at 0x6166a70>

Ответы [ 2 ]

1 голос
/ 11 марта 2011

Как отмечает elv, beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo: устарела в 10.6, и новый метод для использования - beginSheetModalForWindow:completionHandler: Нет метаданных для этого метода в версии PyObjC, поставляемой со Snow Leopard, но с тех пор он был добавлен,и вы можете обновить соответствующий файл самостоятельно, чтобы использовать этот метод.Откройте /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport и найдите в нем элемент:

<class name='NSSavePanel'>

, добавьте следующее:

<method selector='beginSheetModalForWindow:completionHandler:'>
    <arg index='1' block='true' >
        <retval type='v' />
        <arg type='i' type64='q' />
    </arg>
</method>
<method selector='beginWithCompletionHandler:'>
    <arg index='0' block='true' >
        <retval type='v' />
        <arg type='i' type64='q' />
    </arg>
</method>

Это метаданные, которые нужны стороне Python для получения и возврата правильных типов объектов в Objective-C.Вы можете передать любой вызываемый объект для обработчика завершения, если он имеет правильную подпись (то есть принимает целочисленный аргумент и ничего не возвращает).Пример:

def showOpenPanel_(self, sender):
    openPanel = NSOpenPanel.openPanel()

    def openPanelDidClose_(result):
        if result == NSFileHandlingPanelOKButton:
            openPanel.orderOut_(self)
            image = NSImage.alloc().initWithContentsOfFile_(openPanel.filename())
            self.imgView.setImage_(image)
    openPanel.setAllowedFileTypes_(NSImage.imageFileTypes())
    openPanel.beginSheetModalForWindow_completionHandler_(self.imgView.window(), 
                                                          objc.selector(openPanelDidClose_, argumentTypes='l'))
1 голос
/ 02 марта 2011

beginSheetForDirectory: файл: modalForWindow: modalDelegate: didEndSelector: contextInfo: устарел в 10.6: http://developer.apple.com/library/mac/#documentation/cocoa/reference/ApplicationKit/Classes/NSOpenPanel_Class/DeprecationAppendix/AppendixADeprecatedAPI.html

из-за той же проблемы, так как PyObjC не имеет сигнатуры блока http://pyobjc.sourceforge.net/documentation/pyobjc-core/blocks.html для beginSheetModalForWindow:завершение: и вы можете использовать только runModal

мое решение:

panel = NSOpenPanel.openPanel()
panel.setCanChooseDirectories_(NO)
panel.setAllowsMultipleSelection_(NO)

panel.setAllowedFileTypes_(self.filetypes)
panel.setDirectoryURL_(os.getcwd())

ret = panel.runModal()
if ret:
    print panel.URL()

panel.URL () возвращает выбор пользователя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...