2010-09-28 5 views
0

Le code suivant qui a bien fonctionné sous OS X 10.5 ne maintenant 10.6:Problème avec openPanelDidEnd à PyObjC à 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): 

L'erreur que je reçois est:

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

Répondre

1

beginSheetForDirectory: file: modalForWindow : modalDelegate: didEndSelector: contextInfo: a été déprécié dans 10.6: http://developer.apple.com/library/mac/#documentation/cocoa/reference/ApplicationKit/Classes/NSOpenPanel_Class/DeprecationAppendix/AppendixADeprecatedAPI.html

de lutter contre le même problème cause PyObjC n'a aucun bloc signature http://pyobjc.sourceforge.net/documentation/pyobjc-core/blocks.html pour beginSheetModalForWindow: completionHandler: et vous ne pouvez utiliser runModal

ma solution:

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() retourne la sélection de l'utilisateur.

1

Comme notes ELV, beginSheetForDirectory:file:modalForWindow:modalDelegate:didEndSelector:contextInfo: a été dépréciée en 10.6 et la nouvelle méthode à utiliser est beginSheetModalForWindow:completionHandler: Il n'y a pas de métadonnées pour cette méthode dans la version de PyObjC livré avec Snow Leopard, mais il a depuis été ajouté, et vous pouvez mettez à jour le fichier approprié vous-même afin que vous puissiez utiliser cette méthode. Ouvrez /System/Library/Frameworks/Python.framework/Versions/2.6/Extras/lib/python/PyObjC/AppKit/PyObjC.bridgesupport et trouver l'élément:

<class name='NSSavePanel'> 

intérieur, ajoutez les éléments suivants:

<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> 

Voici les métadonnées dont le côté Python a besoin pour obtenir et renvoyer les types d'objets corrects à Objective-C. Vous pouvez passer n'importe quel appelable pour le gestionnaire de complétion, tant qu'il a la bonne signature (c.-à-d., Prend un argument entier et ne renvoie rien). Un exemple:

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')) 
Questions connexes