2017-10-12 13 views
1

Hey je veux comprendre le processus d'importation et de rechargement de scripts avec Python dans Maya.Maya Python appeler les fonctions de classe modul

J'ai le code suivant qui jette l'erreur suivante:

# NameError: name 'MyClass' is not defined # 

Il crée la fenêtre, mais quand j'appuie sur le bouton, il me donne l'erreur ci-dessus. Ce serait génial si quelqu'un pouvait m'aider ce qui me manque ici.

import maya.cmds as cmds 
from functools import partial 

class MyClass(): 

    @classmethod 
    def createWindow(cls): 

     windowID = 'window' 

     if cmds.window(windowID, exists = True): 
      cmds.deleteUI('window') 

     window = cmds.window(windowID, title="Blast", iconName='Blast', widthHeight=(400, 200)) 
     cmds.frameLayout(label='') 

     cmds.button(label='Playblast' ,command= 'MyClass.createPlayblast()') 

     cmds.showWindow(window) 

    @classmethod 
    def createPlayblast(cls): 

     cmds.playblast(f= "playblast", fmt= "image") 
     print "hallo" 

MyClass.createWindow() 

J'appelle mon Modul comme ceci:

# call loadTest 

import sys 
Dir = 'S:/people/Jan-Philipp/python_scripts' 
if Dir not in sys.path: 
sys.path.append(Dir) 
try: reload(loadTest) 
except: from loadTest import MyClass 

loadTest.MyClass() 

Cheers, espérons que vous avez tous une belle journée!

Répondre

1

Vous voulez probablement supprimer MyClass.createWindow() de la fenêtre, et laissez cela au code appelant. Comme écrit il va créer une fenêtre chaque fois que vous importer le module. Il est préférable de ne placer que du code d'initialisation dans la portée du module.

Le problème dans ce cas est que vous essayez d'appeler la classe comme s'il s'agissait d'une fonction. Si vous ne voulez classmethod, vous feriez comme ça

import loadTest 

loadTest.MyClass.createWindow() 

En Python nous ne avons généralement pas besoin de faire faire des classes qui ont seulement des méthodes de classe: Un module est généralement ce que vous utilisez. Dans ce cas:

import maya.cmds as cmds 
from functools import partial 

def createWindow(): 

    windowID = 'window' 

    if cmds.window(windowID, exists = True): 
     cmds.deleteUI('window') 

    window = cmds.window(windowID, title="Blast", iconName='Blast', widthHeight=(400, 200)) 
    cmds.frameLayout(label='') 

    cmds.button(label='Playblast' ,command= createPlayblast) 

    cmds.showWindow(window) 

def createPlayblast(): 

    cmds.playblast(f= "playblast", fmt= "image") 
    print "hallo" 

et

import loadTest 
loadTest.createWindow() 

Un module est un meilleur outil pour regrouper les fonctions liées à une classe. Les classes n'ont de sens qu'en Python si la classe contient des données persistantes.

+0

Isent cette ligne dans votre message faux dans ce cas? cmds.button (label = 'Playblast', commande = 'MyClass.createPlayblast()') serait quelque chose comme: ou? cmds.button (label = 'Playblast', commande = 'createPlayblast()') –

+0

Oui, c'est correct. – theodox

+1

En outre, n'utilisez pas la version de référence de chaîne des callbacks - passez directement les fonctions python. Les versions de chaîne fonctionnent différemment dans l'écouteur et dans le code de production, ce qui produit beaucoup de bogues. Voir https://theodox.github.io/2014/maya_callbacks_cheat_sheet – theodox